2014-10-10 76 views
1

我有一項任務要求我使用海量數據同步,PHP由於腳本的執行時間很短而無法處理。我的選擇是啓動一個Python腳本並讓PHP終止(給用戶提供「成功完成」等信息)。我嘗試了所有的選項,我可以在這裏找到SO和其他地方,我通過谷歌發現,但沒有任何作品。從PHP啓動獨立Python進程

在我第一次嘗試失敗後,我想出了這個想法,我的PHP腳本將啓動第一個Python腳本(可以稱之爲testcmd.py)。然後他們將啓動Python腳本並獨立進程(我們稱之爲thecommand.py),它不受其束縛(像分離線程那樣)並終止。這將避免在同一時間掛PHP腳本完成我想要

不幸的是,我還沒有找到從testcmd.py 我已經嘗試了很多事情,但這裏是我當前的代碼獨立開展thecommand.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

通常,用於執行此類任務的方法是讓後臺「worker」線程運行,定期檢查「工作隊列」。然後他們的工作人員根據需要處理事情(並且不需要啓動子線程,因爲它不受Web服務器執行時間的限制)。

所以試着從那開始。你的隊列可以在你的數據庫中,而你的後臺作業可以是一個cronjob,它可以檢查每分鐘(或5等)。

這也意味着你不需要需要啓動一個Python腳本,但可以使用另一個PHP腳本,如果這對您的業務邏輯更好。

+0

所以基本上你說cron一個工作,運行5分鐘,然後檢查數據庫條目,一旦它完成標記不知何故? 5分鐘後如何定期檢查添加到服務器負載?我想只是想聽到 – 2014-10-11 09:27:57

+0

這是正確的重新標記數據庫中的條目。重新加載服務器,並不是那麼多,就好像沒有任何東西需要處理,那麼這個過程就可以退出。我的建議和你的想法之間唯一的區別是定期發佈時間。除此之外,您的流程執行將會出現大部分負載。無論如何,這都會發生。 – acorncom 2014-10-11 13:05:13

+0

酷感謝很多哥們 – 2014-10-12 20:58:22