2014-02-20 58 views
1

我已經寫一個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是停留在systemexec電話。 我試過使用不同的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 

爲了這個我整天都在擠我的頭。如果你提出任何建議,這將是一個巨大的幫助。

+0

你在centos盒子上啓用了shm嗎?你有沒有嘗試運行沒有PHP的腳本來查看輸出? –

+0

@JimmyKane謝謝你的回覆。 Python腳本本身很好,我不知道如何啓用shm。我發現所有的子進程仍然保留在進程列表中並永久休眠。 – JonnyRocks

+0

如果以'php call_tmn.php'手動運行它,它會工作嗎?你嘗試過'devnull = open(os.devnull,'r + b')'並將所有流(stdin/stdout/stderr)設置爲'devnull'。加入'close_fds = True'不會有什麼影響。 – jfs

回答

0

這可能是廣泛的標誌,但解決「奇怪的問題,只發生在centos」的拇指解決方案是「你試過禁用selinux?」

也許你應該嘗試禁用它(http://www.cyberciti.biz/faq/howto-turn-off-selinux/),重新啓動並再次嘗試你的代碼。如果它有效,您將學習在所有系統上禁用selinux,或者您將嘗試瞭解selinux如何工作,在這種情況下,祝您好運並帶來大量阿司匹林。

+0

我目前不是管理員用戶。我會試着要求管理員這樣做。謝謝! – JonnyRocks