2014-10-10 3 views
1

У меня есть задача, требующая от меня работать с массивной синхронизацией данных, которую PHP не может обработать из-за короткого времени выполнения скрипта. Опция, которую я имею, заключается в запуске скрипта Python и прекращении работы PHP (с таким сообщением, как «Успешно сделано»). Я пробовал все параметры, которые я мог найти здесь, в SO и в другом месте, которые я нашел через google, но никто не работает.Запуск независимого процесса Python с PHP

После того как я потерпел неудачу с первой попыткой, я придумал эту идею, мой PHP-скрипт запустит первый скрипт Python (позвонит testcmd.py). Затем скрипт Python запускает и независимый процесс (позволяет называть его thecommand.py), который не привязан к нему (что-то вроде отдельных потоков) и завершается. Это позволит избежать подвешивания PHP скрипт в то же время сделать то, что я хочу

К сожалению, я до сих пор найти способ самостоятельно запускать thecommand.py из testcmd.py Я пытался много вещей, но вот мой текущий код. Если у вас есть лучшая идея о том, как это сделать, я с удовольствием поеду по этому маршруту.

run_command.php

$cmd = "./testcmd.py"; 
$output = []; 
exec("$cmd 2>&1", $output, $return_status); 
print_r($output); 
echo $return_status; 

testcmd.py

#!/usr/bin/env python 
import subprocess 
import sys 

# some code here 
print "Launching Command" 
#proc = Popen([cmd_str], shell=True, 
#    stdin=None, stdout=None, stderr=None, close_fds=True) 
pid = subprocess.Popen([sys.executable, "/path/to/file/no/spaces/in/path/thecommand.py"], stdin=None, stdout=None, stderr=None, close_fds=True) # call subprocess 

thecommand.py

#!/usr/bin/env python 

import json 
import urllib2 

url = 'http://some/api/url/here/2' 
data = urllib2.urlopen(url).read() 
js = json.JSONDecoder().decode(data) 
for user in js: 
    print js 

ответ

1

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

Итак, попробуйте начать с этого. Ваша очередь может быть в вашем дне, а фоновая работа может быть кроной, которая проверяется каждую минуту (или 5 и т. Д.).

Это также означает, что вам не нужно , чтобы запустить скрипт Python, но может использовать другой скрипт PHP, если это лучше работает с вашей бизнес-логикой.

+0

так что в основном вы говорите, что cron запускает задание, пусть говорит 5 минут, которое затем проверяет запись db и как только ее сделанные знаки каким-то образом? Как такая периодическая проверка позволяет сказать через 5 минут добавить нагрузку на сервер? Я предполагаю, что нет, но хотел бы услышать –

+0

Это верно, повторив запись в db. Re сервер нагрузки, это не так много, как если бы нечего обрабатывать, то процесс просто может просто выйти. Единственное различие между моим предложением и тем, о чем вы думали, это регулярное время запуска. Помимо этого, выполнение процесса будет выполняться в большинстве случаев. И это произойдет независимо. – acorncom

+0

Круто спасибо большому приятелю –

Смежные вопросы