我有一个简单的 PHP 脚本,我想从终端运行它,并且能够处理信号代码。该脚本创建 TCP 服务器并处理连接。不知道为什么,但我无法让信号处理工作:
<?php
declare(ticks = 1);
// Register shutdown command.
pcntl_signal(SIGINT, function ($sig) {
echo 'Exiting with signal: ' . $sig;
global $sock;
global $client;
socket_close($sock);
socket_close($client);
exit(1);
});
$address = '127.0.0.1';
$port = 1234;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $address, $port) or die('Could not bind to address.');
socket_listen($sock);
while (TRUE) {
$client = socket_accept($sock);
if ($client) {
$input = socket_read($client, 1024000);
socket_write($client, var_export($input, TRUE));
socket_write($client, 'End of data transmission.');
socket_close($client);
}
usleep(100);
}
Run Code Online (Sandbox Code Playgroud)
CTRL+C 不会终止应用程序或调用函数。 …
这是我的代码,里面index.php
(只是一个例子):
$pid = pcntl_fork();
if ($pid == -1) {
die("failed to fork");
} else if ($pid) {
// nothing to do
} else {
putDataIntoWebService();
exit();
}
echo "normal page content";
Run Code Online (Sandbox Code Playgroud)
此代码段在命令行中正常工作.在Apache中exit()
,父母和孩子一起杀死它们.什么是变通方法?
我编写简单的需求检查脚本.它会检查所有安装的必需PHP模块.我需要检查是否安装了pcntl.但是这个模块只能在cgi环境中访问,对于Web查询是不可见的.extension_loaded('pcntl')和function_exists('pcntl_fork')都返回false.我该如何执行此检查?
以下是来自http://www.php.net/manual/en/intro.pcntl.php的报价
Process Control should not be enabled within a web server environment and unexpected results may happen if any Process Control functions are used within a web server environment.
在我的网络服务器上启用它有什么副作用?它的威胁和安全问题是什么?
非常感谢你的帮助
我有一台运行OSX Yosemite的Macbook Pro.我试图pcntl_fork()
在命令行上运行一个简单的PHP脚本(命令:) php pcntl.php
:
<?php
$pid = pcntl_fork();
switch($pid) {
case -1:
print "Could not fork!\n";
exit;
case 0:
print "In child!\n";
break;
default:
print "In parent!\n";
}
?>
Run Code Online (Sandbox Code Playgroud)
答案是这样的:
致命错误:
在第2行的/Users/grant/Desktop/test/pcntl.php中调用未定义的函数pcntl_fork()
我已经看过很多文章,告诉你如果你运行mamp如何安装pcntl,但如果你只是使用终端,你会如何安装pcntl?如果在命令行中无法做到这一点,PHP中是否有类似的功能?