问题标签 [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.

0 投票
1 回答
435 浏览

php - PCNTL-PHP 对守护进程有什么好处

我正在研究并尝试使用 php 执行守护进程,我发现自己不得不重新编译 PHP 以启用 PCNTL。然后我开始做一些测试。我分叉了单个孤儿示例:

然后我运行了脚本:

一切进展顺利,文件 /dev/null.txt 被清除,并且每 1 秒在无限循环中更新。

然后我想知道 PCNTL 的好处,所以我更改了代码:

前面的两个例子都给了我相同的结果。我错过了什么吗?你能指导我吗

0 投票
1 回答
807 浏览

php - 未收到 pcntl_signal 信号

我在pcntl_signal没有接收到从另一个进程发送的信号时遇到了一些问题。我有一个脚本,它分叉一个新进程,启动 2 个后台线程,然后循环控制器(主)线程,直到它收到一个停止信号(SIGUSR1)但从未收到该信号。这是我的线程代码(仅出于演示目的登录循环)。

在一个单独的进程中,我们向另一个进程发出信号,如下所示:

信号处理程序永远不会被调用。

我究竟做错了什么?

0 投票
1 回答
15896 浏览

php - PHP pcntl 模块安装

我即将开始使用 composer 使用 yii 框架,为此我需要这个 php pcntl 模块工作。正如我从手册中阅读的那样,默认情况下它没有安装在 ubuntu 中。因此,我发现了一些类似这样的说明

并进行安装。但知道我收到消息

这可能意味着这个模块可能已经在我的系统中了。那么我现在的步骤是什么?只是不注意这个警告,或者我必须做些什么来解决这个问题?

0 投票
0 回答
1214 浏览

php - 在对象方法上设置的 pcntl_signal 回调

我一直在尝试在对象方法上设置 SIGTERM 处理程序,但我发现了一些我不明白的东西。让我们考虑以下代码:

如果我调用 $a->start(),SIGTERM 只会中断 sleep(),但永远不会调用处理程序。但是,如果我尝试 while($a->run()) sleep(2);,这实际上与以前相同,则会调用处理程序并按预期停止执行。谁能解释这种行为?

0 投票
3 回答
87 浏览

php - 需要解释 pcnt_fork()

我是 pcnt_fork 的新手,

输出 : 25347-parent 0-child

我的问题是,这里的 $pid 将是子进程的进程 ID,即 25347 对吗?那么它应该只回显父级,然后为什么它也将 0-child 作为输出...任何人都可以解释

0 投票
1 回答
510 浏览

php - PHP如何处理具有相同排他锁的两个进程?

看来,当php使用flock()获取一个文件的排他锁,然后使用pcntl_fork拆分成两个进程时,两个进程拥有相同的排他锁——也就是说,进一步调用flock($fd, LOCK_EX ) 在该文件句柄上返回 true。

但是,使用flock 的目的是防止两个进程同时写入同一个文件。那么 PHP 是如何处理这种情况的呢?它是否允许以某种方式都具有排他锁的两个进程发生冲突?一个进程是否有任何方法(无需创建新的文件处理程序)来检测另一个进程是否已释放锁?

这主要是学术好奇心。我知道这可以通过创建一个新的文件处理程序来处理,或者作为最后的手段使用 IPC 通知其他进程,但我想知道 flock 系统中是否有内置方法来检测锁的重复?

0 投票
1 回答
6070 浏览

php - PHP 睡眠、pcntl_signal 和滴答声

好的,所以我一直在尝试Process Signals使用PHP脚本。我遇到了很多我不确定发生了什么的事情,而且我觉得文档并不能很好地解释它。

因此,假设我按照注册信号的示例进行操作:

但是,在我的sig_handler函数中,我exit(1)在最后添加了一个。还会echo "Done\n";被执行吗?我尝试过类似的事情,尽管是在一个班级结构中,而且只是sig_handler被召唤之前。

我的班级__construct调用该函数registerSignals

然后在我对这个过程的测试中,我做了一些简单sleep的 s 和echos (start只是在构造和信号注册完成后调用的一个函数):

所以我ctl-csleep. 我的结果?

正如您从我echo的 s 中看到的那样,我有点想也许滴答声的工作方式负责在处理信号之前start完成功能。我仍然认为可能是这种情况。事实是,我只是不知道。

我确实ticks在我的程序顶部声明:

不立即处理信号给我带来了问题。例如,如果我的函数中有这段代码start(并且我已经对此进行了测试)怎么办?

即使我的cleanup函数有一个exit,我也永远不会达到那个,因为SIGINT只是把我从 中敲出来sleep,我继续循环并重新开始sleep

所以这是我的问题:signal处理如何工作PHP?如何保证当我收到信号时,立即处理?我不只是想要一些可以解决这个问题的代码,我想要一个解释(或至少一个好的链接和摘要)。

PHP版本:5.4.22

操作系统:Ubuntu 12.10

0 投票
1 回答
1406 浏览

php - pcntl_fork() 在 PHP 5.3.8 中不起作用

我在 Windows 操作系统中运行 wampp 服务器。无论何时pcntl_fork()尝试,致命错误都会显示为Fatal error: Call to undefined function pcntl_fork()

我发现 PCNTL 扩展需要 *nix 平台。如果是这样,Windows 有任何 PCNTL 的替代品吗?

非常感谢。

0 投票
1 回答
680 浏览

php - 在 RAII 中删除共享内存和信号量的正确策略,如 php 类

什么时候出现这种情况?

如果您使用共享内存和信号量进行进程间锁定(使用pcntl 扩展),您应该关心信号量和共享内存段生命周期。例如,您编写后台工作者应用程序并使用主进程和一些子(分叉)进程进行作业处理。在它们之间使用共享内存和信号量是 IPC 的好主意。并且RAII像围绕 shm_xxx 和 sem_xxx php 函数的类包装器看起来也是个好主意。

例子

不是好的选择 - 在分叉之后,我们在父进程中有一个实例,在子进程中有一个实例。并且其中任何一个的析构函数都会破坏信号量。

为什么重要

大多数 linux 系统对共享内存计数的信号量都有限制。如果您的应用程序应该创建和删除信号量的许多共享内存段,那么您不能等待它在进程关闭时自动释放。

问题

使用с您可以使用shmctlIPC_RMID- 它标记要删除的段。当当前附加到该段的最后一个进程已正确分离它时,实际删除本身就会发生。当然,如果当前没有进程附加到该段,则删除似乎是立即的。它就像简单的参考计数器一样工作。但是 php 不实现shmctl.

另一种策略 - 仅在主进程的析构函数中销毁信号量:

所以,问题是

  1. 如果有什么方法可以在 php 中使用 IPC_RMID?
  2. 在这种情况下应该使用什么策略?只在主进程中销毁?其他情况?
0 投票
1 回答
2881 浏览

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,但我没有收到错误。