我有MAMP,我需要启用-pcntl
当前的MAMP安装.我怎么能这样做?
谢谢你的帮助.
我已经安装在我的PHP 5.4.6在Ubuntu 32位12.10跑了pcntl,使用此文章.
它完全没有顺利,因为在编译之后,make test
我遇到了以下错误.每当我试图分叉子进程时,我都会收到警告:
警告:出于安全原因,已在第8行的/var/www/mydev/dev/mailServiceTest.php中禁用了pcntl_fork()
我在网上搜索了一个解决方案,但遗憾的是我没有在其他地方找到任何提及这个问题.
Build complete.
Don't forget to run 'make test'.
PHP Warning: Module 'pcntl' already loaded in Unknown on line 0
PHP Warning: Module 'pcntl' already loaded in Unknown on line 0
=====================================================================
PHP : /usr/bin/php
Warning: Module 'pcntl' already loaded in Unknown on line 0
PHP_SAPI : cli
PHP_VERSION : 5.4.6-1ubuntu1.2
ZEND_VERSION: 2.4.0
PHP_OS : Linux - Linux oleg-Lenovo-G580 3.5.0-26-generic #42-Ubuntu SMP Fri Mar 8 23:20:06 UTC 2013 i686
INI …
Run Code Online (Sandbox Code Playgroud) 我pcntl_fork
在PHP中感到困惑.
我认为它确实是多线程的,但它是如何工作的,我将如何在脚本中使用它?
我正在尝试使用pcntl_fork()分叉命令行运行XAMPP php进程.当我运行以下命令时:
$pid = pcntl_fork();
if($pid == -1){
file_put_contents('testlog.log',"\r\nFork Test",FILE_APPEND);
return 1; //error
}
else if($pid){
return 0; //success
}
else{
file_put_contents($log, 'Running...', FILE_APPEND);
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
Fatal error: Call to undefined function pcntl_fork()
Run Code Online (Sandbox Code Playgroud)
谁能建议如何解决这个问题?
我正在开发一个定期调用后台进程的应用程序.其中一个是由cron调用的,但我正在寻找更强大的东西,所以我将它转换为在Supervisor下运行.(它可能会运行10分钟,在此期间它可以检测要执行的工作,或者空闲.一旦退出,Supervisor将自动重新生成一个干净的实例.)
由于Supervisor更好地确保只有特定数量的某些实例并行运行,因此我可以更长时间地运行它们.但这确实意味着我的进程更可能直接接收终止信号kill
,或者因为它们已经通过Supervisor停止.因此,我正在尝试如何在PHP中处理这个问题.
看起来基本的解决方案是这样使用pcntl_signal()
:
declare(ticks = 1);
pcntl_signal(SIGTERM, 'signalHandler');
pcntl_signal(SIGINT, 'signalHandler');
function signalHandler($signal) {
switch($signal) {
case SIGTERM:
case SIGINT:
echo "Exiting now...\n";
exit();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我的代码中有几点可以通过仔细的关机处理来完成.一种方法是让一个处理程序调用那些不同的东西,但它需要一些重构,我想避免.另一种方法是添加pcntl_signal()
我需要的任何地方,但不幸的是,似乎只能同时安装一个处理程序.
但是,看起来我可以使用register_shutdown_function()
.这本身并没有陷阱^C
或其他终止sigs,手册在这一点上非常明确:
如果使用SIGTERM或SIGKILL信号终止进程,则不会执行关闭功能
令人惊讶的是,我发现,如果我使用pcntl_signal()
只是做一个出口,然后关机处理程序是确实调用.此外,由于可以有许多关闭处理程序,这很好地解决了我的问题 - 我的代码中希望正常处理终止的每个类都可以捕获和管理自己的关闭.
我最初的问题是,为什么这有效?我已经尝试在没有信号处理程序的情况下注册关闭函数,并且似乎没有调用,正如手册所说.我想这个过程是由PHP保持活着以处理信号,这会导致关闭处理程序被调用?
另外,当手册对它产生怀疑时,我可以依赖这种行为吗?我使用的是PHP 5.5,我还没有想要升级到PHP7.因此,我会对5.5和5.6是否适用于各种发行版感兴趣.
当然,如果它(或不会)在7.0和/或7.1上工作,那也会很有趣 - 我知道虽然在7.1中处理滴答的方式不同,所以这种行为有更大的可能性.
我在Windows中运行PHPUnit并尝试通过composer.json安装PHPUnit :
"phpunit/php-invoker": "*"
Run Code Online (Sandbox Code Playgroud)
...有这种依赖,但我得到这个错误:
phpunit/php-invoker 1.1.3需要ext-pcntl* - >系统中缺少所请求的PHP扩展pcntl.
如何安装此扩展?
我需要有关如何:在Ubuntu PHP中启用PCNTL的帮助.
$ mkdir /tmp/phpsource
$ cd /tmp/phpsource
$ wget http://museum.php.net/php5/php-5.3.2.tar.gz
$ tar xvf php-5.3.2.tar.gz
$ cd php-5.3.2/ext/pcntl
$ phpize -bash: phpize: command not found
Run Code Online (Sandbox Code Playgroud)
一切都很顺利,直到我试图运行phpize!然后我得到错误'-bash:phpize:command not found'?? 有任何想法吗?
UPDATE运行:
$ sudo apt-get update
Run Code Online (Sandbox Code Playgroud)
然后跑:
$ sudo apt-get install php5-dev
Run Code Online (Sandbox Code Playgroud)
在尼克的帮助下,我设法完成了这个程序.但'make test'失败了?
$ phpize
$ ./configure
$ make
$ cp modules/pcntl.so /usr/lib/php5/20090626/
$ echo "extension=pcntl.so" > /etc/php5/conf.d/pcntl.ini
$ make test - FAILED!
Run Code Online (Sandbox Code Playgroud)
帮助:我键入'echo'extension = pcntl.so> /etc/php5/conf.d/pcntl.ini'而不是'echo"extension = pcntl.so"> /etc/php5/conf.d/pcntl.ini "我第一次跑这个.那是不是很糟糕?
---------------------------------制作TEst错误信息------------- -------------------------
PHP Deprecated: Comments starting with '#' are deprecated …
Run Code Online (Sandbox Code Playgroud) 所以我想做以下事情:
设置一个派生一串进程的守护进程.
因此,守护进程会分叉一堆进程,然后分叉另一堆进程
问题是子进程可能需要很长时间才能退出.如果父进程有其他工作要做,尽管要求孩子,我如何防止僵尸儿童?
父进程(守护进程)执行以下操作:
while(true)
{
SQL QUERY EXECUTED
while(mysql_fetch_array)
{
Fork children
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果父进程除了分支子进程以及子进程需要很长时间退出之外还必须执行其他工作,我该如何等待子进程退出.
我正在使用System守护程序PEAR函数来创建守护程序和创建进程的pcntl_fork
函数.
我该如何处理CTRL+ CPHP中的命令行?Pcntl_*
功能在Windows中不起作用.
Lemme首先给出了我所拥有的代码的基本描述.我从一个主要的父进程开始(注意:为了简单起见,我没有显示所有函数.如果你需要我在任何时候进行扩展,请告诉我):
declare(ticks=1);
pcntl_signal(SIGHUP, array('forker', 'restartSignalHandler'));
if(forker_is_not_running()){
new Forker();
}
class Forker {
private $active_forks = array();
private $parent_pid = null;
public function __construct(){
$this->parent_pid = getmypid();
$this->create_fork();
$this->wait_for_active();
}
public function wait_for_active(){
while(!empty($this->active_forks)){
foreach($this->active_forks as $k=>$fork){
if($this->fork_no_longer_running($fork)){
unset($this->active_forks[$k]);
}
}
}
}
// Pseudo code
public function fork_no_longer_running($pid){
// return true if 'ps -elf | grep $pid' doesn't returns only the grep command
// else return false (aka the fork is still running)
}
public function create_fork(){
$pid = pcntl_fork(); …
Run Code Online (Sandbox Code Playgroud)