Lisp и Web-программирование

Oct 17, 2009 18:03


Итак, сейчас я экспериментирую со способами подключения лиспа к
задачам веб-программирования. Самый очевидный вариант, приходящий в
голову первым я уже реализовал. Остановимся на нем подробнее:

Php-скрипт, когда ему нужно обратиться к лисп-программе может открыть
сокет. Если на том же сервере есть сокет-сервер, написанный на лиспе,
который слушает нужный порт - они могут обмениваться данными

+------------------------+ +----------------------+
| process: apache2 | | process: sbcl |
| +-------------+ | +-----------------+
| | mod_php |---------------->| | my_server.lisp |
+----------+----------+--+ socket +----+-----------------+

Вот примерно так выглядит заготовка для сокет-сервера на лиспе:

(require 'asdf)
(require 'usocket)

(defconstant +address+ "127.0.0.1"
"Listening address")

(defconstant +port+ 9300
"Listening port")

(defconstant +backlog+ 2
"Queue length")

(defun start-rp-listener ()
"Start the server, run accept loop."
(let ((sock (usocket:socket-listen +address+ +port+ :backlog +backlog+ :reuseaddress t)))
(labels ((rep-loop (s)
(let ((line (read-line s nil)))
(cond
((equal line "quit") t)
((stringp line)
(progn
(format s "~A~%" (eval (read-from-string line)))
(force-output s)
(rep-loop s)))
(t t))))
(accept-connection (s)
(let* ((lsock (usocket:socket-accept s))
(cstream (usocket:socket-stream lsock)))
(sb-thread:make-thread
(lambda ()
(unwind-protect
(rep-loop cstream)
(progn
(close cstream)
(usocket:socket-close lsock))))))
(accept-connection s)))
(unwind-protect
(accept-connection sock)
(usocket:socket-close sock)))))

Проверить его работу можно подключившись к нему телнетом и отправляя
правильные лисп-выражения, которые будут исполнены.

В комментариях к предыдущему посту dark_aurel, по-видимому
гораздо более опытный в работе с лиспом предложил более удачное
решение, до которого я еще дойду. Но сначала для понимания всех
процессов стоит рассмотреть возможные очевидные решения и "походить по
граблям".

lisp

Previous post Next post
Up