问题标签 [pcntl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - PCNTL-PHP 对守护进程有什么好处
我正在研究并尝试使用 php 执行守护进程,我发现自己不得不重新编译 PHP 以启用 PCNTL。然后我开始做一些测试。我分叉了单个孤儿示例:
然后我运行了脚本:
一切进展顺利,文件 /dev/null.txt 被清除,并且每 1 秒在无限循环中更新。
然后我想知道 PCNTL 的好处,所以我更改了代码:
前面的两个例子都给了我相同的结果。我错过了什么吗?你能指导我吗
php - 未收到 pcntl_signal 信号
我在pcntl_signal
没有接收到从另一个进程发送的信号时遇到了一些问题。我有一个脚本,它分叉一个新进程,启动 2 个后台线程,然后循环控制器(主)线程,直到它收到一个停止信号(SIGUSR1)但从未收到该信号。这是我的线程代码(仅出于演示目的登录循环)。
在一个单独的进程中,我们向另一个进程发出信号,如下所示:
信号处理程序永远不会被调用。
我究竟做错了什么?
php - PHP pcntl 模块安装
我即将开始使用 composer 使用 yii 框架,为此我需要这个 php pcntl 模块工作。正如我从手册中阅读的那样,默认情况下它没有安装在 ubuntu 中。因此,我发现了一些类似这样的说明
并进行安装。但知道我收到消息
这可能意味着这个模块可能已经在我的系统中了。那么我现在的步骤是什么?只是不注意这个警告,或者我必须做些什么来解决这个问题?
php - 在对象方法上设置的 pcntl_signal 回调
我一直在尝试在对象方法上设置 SIGTERM 处理程序,但我发现了一些我不明白的东西。让我们考虑以下代码:
如果我调用 $a->start(),SIGTERM 只会中断 sleep(),但永远不会调用处理程序。但是,如果我尝试 while($a->run()) sleep(2);,这实际上与以前相同,则会调用处理程序并按预期停止执行。谁能解释这种行为?
php - 需要解释 pcnt_fork()
我是 pcnt_fork 的新手,
输出 : 25347-parent 0-child
我的问题是,这里的 $pid 将是子进程的进程 ID,即 25347 对吗?那么它应该只回显父级,然后为什么它也将 0-child 作为输出...任何人都可以解释
php - PHP如何处理具有相同排他锁的两个进程?
看来,当php使用flock()获取一个文件的排他锁,然后使用pcntl_fork拆分成两个进程时,两个进程拥有相同的排他锁——也就是说,进一步调用flock($fd, LOCK_EX ) 在该文件句柄上返回 true。
但是,使用flock 的目的是防止两个进程同时写入同一个文件。那么 PHP 是如何处理这种情况的呢?它是否允许以某种方式都具有排他锁的两个进程发生冲突?一个进程是否有任何方法(无需创建新的文件处理程序)来检测另一个进程是否已释放锁?
这主要是学术好奇心。我知道这可以通过创建一个新的文件处理程序来处理,或者作为最后的手段使用 IPC 通知其他进程,但我想知道 flock 系统中是否有内置方法来检测锁的重复?
php - PHP 睡眠、pcntl_signal 和滴答声
好的,所以我一直在尝试Process Signals
使用PHP
脚本。我遇到了很多我不确定发生了什么的事情,而且我觉得文档并不能很好地解释它。
因此,假设我按照注册信号的示例进行操作:
但是,在我的sig_handler
函数中,我exit(1)
在最后添加了一个。还会echo "Done\n";
被执行吗?我尝试过类似的事情,尽管是在一个班级结构中,而且只是在我sig_handler
被召唤之前。
我的班级__construct
调用该函数registerSignals
:
然后在我对这个过程的测试中,我做了一些简单sleep
的 s 和echo
s (start
只是在构造和信号注册完成后调用的一个函数):
所以我ctl-c
在sleep
. 我的结果?
正如您从我echo
的 s 中看到的那样,我有点想也许滴答声的工作方式负责在处理信号之前start
完成功能。我仍然认为可能是这种情况。事实是,我只是不知道。
我确实ticks
在我的程序顶部声明:
不立即处理信号给我带来了问题。例如,如果我的函数中有这段代码start
(并且我已经对此进行了测试)怎么办?
即使我的cleanup
函数有一个exit
,我也永远不会达到那个,因为SIGINT
只是把我从 中敲出来sleep
,我继续循环并重新开始sleep
。
所以这是我的问题:signal
处理如何工作PHP
?如何保证当我收到信号时,立即处理?我不只是想要一些可以解决这个问题的代码,我想要一个解释(或至少一个好的链接和摘要)。
PHP版本:5.4.22
操作系统:Ubuntu 12.10
php - pcntl_fork() 在 PHP 5.3.8 中不起作用
我在 Windows 操作系统中运行 wampp 服务器。无论何时pcntl_fork()
尝试,致命错误都会显示为Fatal error: Call to undefined function pcntl_fork()
。
我发现 PCNTL 扩展需要 *nix 平台。如果是这样,Windows 有任何 PCNTL 的替代品吗?
非常感谢。
php - 在 RAII 中删除共享内存和信号量的正确策略,如 php 类
什么时候出现这种情况?
如果您使用共享内存和信号量进行进程间锁定(使用pcntl 扩展),您应该关心信号量和共享内存段生命周期。例如,您编写后台工作者应用程序并使用主进程和一些子(分叉)进程进行作业处理。在它们之间使用共享内存和信号量是 IPC 的好主意。并且RAII
像围绕 shm_xxx 和 sem_xxx php 函数的类包装器看起来也是个好主意。
例子
不是好的选择 - 在分叉之后,我们在父进程中有一个实例,在子进程中有一个实例。并且其中任何一个的析构函数都会破坏信号量。
为什么重要
大多数 linux 系统对共享内存计数的信号量都有限制。如果您的应用程序应该创建和删除信号量的许多共享内存段,那么您不能等待它在进程关闭时自动释放。
问题
使用с
您可以使用shmctl和IPC_RMID
- 它标记要删除的段。当当前附加到该段的最后一个进程已正确分离它时,实际删除本身就会发生。当然,如果当前没有进程附加到该段,则删除似乎是立即的。它就像简单的参考计数器一样工作。但是 php 不实现shmctl
.
另一种策略 - 仅在主进程的析构函数中销毁信号量:
所以,问题是
- 如果有什么方法可以在 php 中使用 IPC_RMID?
- 在这种情况下应该使用什么策略?只在主进程中销毁?其他情况?
php - php升级后pcntl_fork导致“errno=32 Broken pipe”
我最近在升级后从 php 5.4.26 升级到 5.4.28 我收到此错误
每当我运行以下代码时:
如果我只派生一个孩子,那么我不会收到 PHP 通知。如果我运行超过 1 个孩子,我会收到除第一个孩子之外的每个孩子的 PHP 通知。
有没有人知道这里发生了什么?
我假设它试图多次关闭 Redis 连接,但这是我已经运行了至少 4 个月没有任何问题的代码。
仅在升级到 5.4.28 后才开始显示这些通知。
我查看了 PHP 更改日志,但看不到任何我认为可以解释此问题的内容。
我应该将此作为错误报告给 PHP 吗?
更新:
看起来它“可能”是一个 Redis 问题,我正在使用phpredis我用 mysql 连接测试了相同的代码,而不是加载 Redis,但我没有收到错误。