Intereting Posts

PHP и shell_exec

У меня есть PHP-сайт, и я хотел бы выполнить очень длинный сценарий Python в фоновом режиме (память 300 МБ и 100 секунд). Коммуникация процесса выполняется через базу данных: когда скрипт Python заканчивает свое задание, он обновляет поле в базе данных, а затем веб-сайт отображает некоторые графики на основе результатов сценария Python.

Я могу выполнить «вручную» скрипт Python из bash (любой текущий каталог), и он работает. Я хотел бы интегрировать его в PHP, и я попробовал функцию shell_exec:

shell_exec("python /full/path/to/my/script") но он не работает (я не вижу никакого вывода)

Есть ли у вас какие-либо идеи или предложения? Стоит упомянуть, что скрипт python является оберткой над другими инструментами polyglot (Java, смешанная с C ++).

Благодаря!

shell_exec возвращает строку, если вы ее запускаете самостоятельно, она не будет выдавать какой-либо вывод, поэтому вы можете написать:

 $output = shell_exec(...); print $output; 

Сначала установите set_time_limit (0); сделает ваш скрипт запущенным навсегда, поэтому тайм-аут не должен быть проблемой. Второй вызов any * exec в PHP НЕ использует PATH по умолчанию (может зависеть от конфигурации), поэтому ваш скрипт выйдет без предоставления какой-либо информации о проблеме, и он довольно часто заканчивается тем, что он не может найти программу, в этом случае python. Поэтому измените его на:

 shell_exec("/full/path/to/python /full/path/to/my/script"); 

Если ваш скрипт python работает на нем без проблем, то, скорее всего, это проблема. Что касается памяти, я уверен, что PHP не будет использовать ту же память, что и python. Так что если он использует 300MB PHP, он должен оставаться на уровне по умолчанию (скажем, 1 МБ) и просто ждать окончания shell_exec.

Пропозицией может быть то, что ваш сценарий занимает больше времени ожидания сервера, определенного для запроса (может быть установлен в php.ini или httpd.conf).

Другая проблема может заключаться в том, что учетная запись серверов не имеет права выполнять или получать доступ к коду или файлам, необходимым для запуска вашего сценария.

Нашел это раньше и помог мне решить проблему с фоновым исполнением:

 function background_exec($command) { if(substr(php_uname(), 0, 7) == 'Windows') { pclose(popen('start "background_exec" ' . $command, 'r')); } else { exec($command . ' > /dev/null &'); } } 

Источник:

http://www.warpturn.com/execute-a-background-process-on-windows-and-linux-with-php/

Спасибо за ваши ответы, но никто из них не работал 🙁 Я решил реализовать грязным способом, используя ожидание, вместо запуска события, когда вставлена ​​запись.

Я написал процесс резервного копирования, который запускается вечно и на каждой итерации проверяет, есть ли что-то новое в базе данных. Когда он находит запись, он выполняет скрипт, и все в порядке. Идея заключается в том, что я запускаю процесс резервного копирования из оболочки.

Я обнаружил, что проблема, когда я пробовал это, был простым фактом, что я не скомпилировал источник на сервере, на котором я его запускал. Компилируя на свой локальный компьютер, а затем загружая его на свой сервер, он каким-то образом будет поврежден. shell_exec () должен работать, компилируя источник, который вы пытаетесь запустить на том же сервере, на котором запущен скрипт.