我写了一个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()
但是当我使用浏览器加载 php 页面时,页面将永远加载,似乎 PHP 卡在system
或exec
调用。我尝试使用不同的 Python 脚本,但只要脚本是并行的(使用多进程或多线程),这个问题肯定会发生。
最奇怪的是,这个问题只发生在我的一个 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 上的奇怪问题"的经验法则是"你试过禁用 selinux 吗?
也许您应该尝试禁用它(http://www.cyberciti.biz/faq/howto-turn-off-selinux/),重新启动并再次尝试您的代码。如果它有效,您将学会在所有系统上禁用selinux,或者您将在尝试了解selinux的工作原理方面进行出色的冒险,在这种情况下,祝您好运并带来大量阿司匹林。