Comments 19
А почему было не использовать собственно nginx, а скрипты дергать по http?
https://github.com/spiral/roadrunner не пробовал?
Какой-то странный подход.
Если нужно было прослушать обмен, то wireshark вам в руки. Возможно, он даже сам протокол декодировать сможет.
Ну и отдельно совершенно непонятно, почему php_fpm использовать можно, а поставить перед ним nginx, который будет принимать запросы и отдавать в php_fpm — нет.
Экономия памяти? Да там копейки…
Лишняя точка отказа? Тоже не факт, nginx наоборот может балансировать трафик на несколько демонов php_fpm и отрабатывать ошибки.
В этой статье основное что хотелось рассказать — это как работает протокол, и как на php можно с ним работать. Конечно врядли php лучший выбор для этого в реальном коде, но для разбора теории вполне норм.
А чем cgi-fcgi не подошла? Она вроде бы придумана специально для решения вашей проблемы.
https://www.opennet.ru/man.shtml?topic=cgi-fcgi&category=1&russian=2
Удобная штука, мы используем в частности для очистки opcache при деплое без перезапуска php-fpm.
Примерно так, может кому пригодится:
#!/bin/bash
WEBDIR="/var/local/www"
RANDOM_NAME=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13).php
sudo -u www-data mkdir -p ${WEBDIR}/opcache
sudo -u www-data touch ${WEBDIR}/opcache/${RANDOM_NAME}
echo "<?php echo \"\\t\"; if (function_exists('opcache_reset')) echo (opcache_reset() ? 'OK' : 'FAIL'); else echo 'FAIL'; ?>" > ${WEBDIR}/opcache/${RANDOM_NAME}
printf "\nTCP/IP\n\t"
sudo -u www-data bash -c "SCRIPT_NAME=/${RANDOM_NAME} SCRIPT_FILENAME=${WEBDIR}/opcache/${RANDOM_NAME} REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9000"
printf "\nSocket\n\t"
sudo -u www-data bash -c "SCRIPT_NAME=/${RANDOM_NAME} SCRIPT_FILENAME=${WEBDIR}/opcache/${RANDOM_NAME} REQUEST_METHOD=GET cgi-fcgi -bind -connect /var/run/php/php7-fpm.sock"
rm -R ${WEBDIR}/opcache
printf "\n\n"
Может быть я не прав, но почему бы не использовать AWS Lambda или Yandex Cloud Functions?
Как "разбор протокола" не плохо. Но это адский ад. Это вообще лишнее, для "дергания" скриптов.
спасибо, очень интересно.
отмечу только, что готовых fastcgi клиентов вполне достаточно https://packagist.org/?query=fastcgi
Написал свой http/https сервер на C#. Убыстрил Python, как интерпретатор за счет маленького скрипта initcgi.py, у которого уже всё готово, он только ждет подключение. После отработки и ответа скрипт закрывается и запускается новый, который ждет дальше. Таких скриптов несколько десятков, все параллельно ждут запросы. Пример скрипта:import runpy
script = input() # Чтение имени скрипта
if script:
runpy.run
_path(script) # Запуск скрипта обработчика запроса
Серверы и скрипт для быстрого cgi здесь Arkady23/http.net-https.net: Multithreaded http.net and https.net servers for Windows.
Запускаем PHP-скриптики через php-fpm без web-сервера. Или свой FastCGI-клиент (под капотом)