我已經寫一個PHP代碼調用很多Python腳本是這樣的:PHP掛起時使用呼叫Python腳本多進程/多線程
<?php
system("tmn", $return_value);
echo $return_value;
?>
下面是Python腳本。
#!/usr/bin/env python
import os
from subprocess import Popen
devnull = open(os.devnull, 'wb')
p = [] # ip -> process
for n in range(1, 20): # start ping processes
ip = "172.28.83.%d" % n
p.append((ip, Popen(['ping', '-c', '1', '-w', '1', ip], stdout=devnull)))
#NOTE: you could set stderr=subprocess.STDOUT to ignore stderr also
while p:
for i, (ip, proc) in enumerate(p[:]):
if proc.poll() is not None: # ping finished
p.remove((ip, proc)) # this makes it O(n**2)
if proc.returncode == 0:
print('%s active' % ip)
elif proc.returncode == 2:
print('%s no response' % ip)
else:
print('%s error' % ip)
devnull.close()
但是,當我用我的broswer加載PHP頁面,該頁面將永遠加載,似乎PHP是停留在system
或exec
電話。 我試過使用不同的Python腳本,但只要腳本是並行的(使用Multiproccessing或Multithreading),這個問題肯定會發生。
最奇怪的是,這個問題只發生在我的一臺Linux服務器(CentOS 6.5)上。
$php -v
PHP 5.5.7 (cli) (built: Jan 3 2014 11:19:10)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
python --version
Python 2.7.6
爲了這個我整天都在擠我的頭。如果你提出任何建議,這將是一個巨大的幫助。
你在centos盒子上啓用了shm嗎?你有沒有嘗試運行沒有PHP的腳本來查看輸出? –
@JimmyKane謝謝你的回覆。 Python腳本本身很好,我不知道如何啓用shm。我發現所有的子進程仍然保留在進程列表中並永久休眠。 – JonnyRocks
如果以'php call_tmn.php'手動運行它,它會工作嗎?你嘗試過'devnull = open(os.devnull,'r + b')'並將所有流(stdin/stdout/stderr)設置爲'devnull'。加入'close_fds = True'不會有什麼影響。 – jfs