问题标签 [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 投票
0 回答
99 浏览

php - 在php中并行运行多个函数

我想并行运行 5 个函数,所有这些函数都将从 SQL 返回结果。

我计划使用pcntl_fork();但不知道如何为这些变量赋值。

0 投票
1 回答
424 浏览

php - HHVM 不能使用 pcntl_fork

我已经在我的 CentOs 6.5 中安装了 hhvm 3.5,它可以正常运行。但是我发现当我使用 pcntl_fork() 函数做某事时。

hhvm 将抛出一个错误

致命错误:在服务器模式下不允许分叉。

它只是在 nginx + hhvm 中发生,在 cli 模式下一切似乎都很好。pcntl_fork()只能在cli模式下运行吗?如果没有,如何让它好起来?

0 投票
1 回答
900 浏览

php - 在 PHP 中卸载一次性工作线程的最佳方法?线程?fcntl?

我应该如何多线程一些需要超时的php-cli代码?

我从命令行在 Centos 6.6 上使用 PHP 5.6。

我对多线程术语或代码不是很熟悉。我将在这里简化代码,但它 100% 代表了我想要做的事情。

非线程代码目前看起来像这样:

我需要预取所有数据集,并且每个 processRawDataAndStoreResultInDB() 都无法获取它自己的数据集。有时 processRawDataAndStoreResultInDB() 处理数据集的时间太长,所以我想限制它处理它的时间。

所以你可以看到使它成为多线程的

  1. 通过允许同时执行多个 processRawDataAndStoreResultInDB() 来加速它
  2. 使用 set_time_limit() 来限制每个人处理每个数据集的时间

请注意,我不需要回到我的主程序。由于这是一种简化,您可以相信我不想收集所有已处理的数据集并在它们全部完成后将它们保存到数据库中。

我想做类似的事情:

从我的在线研究中,我发现了可以与线程安全的 php CLI 一起使用的 PHP 扩展 pthreads,或者我可以使用 PCNTL 扩展或围绕它的包装库(例如,Arara/Process)

但是,当我查看它们及其示例时(尤其是 pthreads 池示例),我很快就会对术语以及应该使用哪些类来实现我正在寻找的那种多线程感到困惑。

如果我在线程类上有 isRunning()、isTerminated()、getTerminationStatus() 和 execute() 函数,我什至不介意自己创建池类,因为它是一个简单的队列。

有更多经验的人可以指导我使用哪个库、类和函数来映射到上面的示例吗?我完全采取了错误的方法吗?

提前致谢。

0 投票
2 回答
641 浏览

php - PHP中的进程重生和信号处理

细节

我在 PHP 中有一个问题,当重生的进程没有处理信号时,在重生之前,处理工作正常。我将代码缩小到非常基本的范围:

如您所见,它执行以下操作:

  • 注册关闭函数,其中重新生成一个进程(因此,当父进程死亡时nohup忽略)SIGHUP
  • pcntl_signal()通过forSIGTERM和注册处理程序SIGCONT。第一个将只记录一个进程已终止的消息,而第二个将导致进程重新启动。它是通过ob_*函数实现的,所以要传递一个标志,应该在关闭函数中做什么——退出或重生。
  • 将脚本“活动”的一些信息记录到日志文件中。

怎么了

所以,我开始脚本:

然后,在日志文件中,有如下条目:

比方说,然后我做kill 8849

因此,它是成功处理SIGTERM(并且脚本确实退出)。现在,如果我改为这样做kill -18 8849,那么我会看到(18 是 的数值SIGCONT):

因此:首先,SIGCONT也得到了正确处理,并且根据下一个“空闲”消息判断,新生成的脚本实例运行良好。

更新#1:我在考虑ppid=1(因此,init全局进程)和孤儿进程信号处理的东西,但事实并非如此。这是日志部分,这表明孤儿(ppid=1)进程不是原因:当通过控制应用程序启动worker时,它也使用system()命令调用它 - 与worker自身重生的方式相同。但是,在控制应用调用 worker 后,它拥有ppid=1并正确响应了信号,而如果 worker 自己重生,则新副本不会响应它们,除了SIGKILL. 所以,只有当工人重生时才会出现问题。

更新 #2:我试图分析strace. 现在,这里有两个块。

  1. 当工人尚未重生时 - strace 输出。看看行45,这是我发送的时候SIGCONT,因此kill -18是一个进程。然后它触发所有链:写入文件,system()调用和退出当前进程。
  2. 当 worker 已经自己重生时 - strace 输出。在这里,看看线路89- 他们收到后出现SIGCONT。首先:看起来进程仍在以某种方式接收信号,其次,它忽略了信号。未执行任何操作,但发送的系统通知了进程SIGCONT。为什么然后进程忽略它 - 问题是(因为,如果安装用户处理程序SIGCONT失败,那么它应该结束执行,而进程没有结束)。至于SIGKILL,那么已经重生的工人的输出就像:

    /li>

这表明,该信号已被接收并做了它应该做的事情。

问题

当进程重生时,它既不会对SIGTERM也不会对做出反应SIGCONT。但是,仍然可以结束它SIGKILL(因此,kill -9 PID确实结束了该过程)。例如,对于两者以上的进程,kill 8875什么kill -18 8875都不做(进程将忽略信号并继续记录消息)。

但是,我不会说注册信号完全失败 - 因为它至少重新定义SIGTERM(这通常会导致终止,而在这种情况下它被忽略)。我也怀疑这ppid = 1指向了一些错误的东西,但我现在不能肯定地说。

另外,我尝试了任何其他类型的信号(实际上,信号代码是什么并不重要,结果总是一样的)

问题

这种行为的原因可能是什么?我正在重生进程的方式正确吗?如果不是,还有哪些其他选项可以允许新生成的进程正确使用用户定义的信号处理程序?

0 投票
1 回答
980 浏览

php - 如何使用 php pcntl_fork 在后台运行函数

我有两个功能。我想通过 mysql 连接在后台运行一个函数,并且不向浏览器返回任何错误或任何内容。我要运行的另一个函数将数据返回给浏览器。

我使用 php pcntl_fork 如下:

在这种情况下,它返回数据库错误号 2006,它只能在function_background().

我希望该功能function_background()通过 mysql 连接在后台完全独立地运行,并且不会因为它的错误或任何东西而干扰浏览器。function_return()并向浏览器发送消息。

感谢任何帮助。如果有人也可以向我指出详细信息,那就太好了。

谢谢。

0 投票
1 回答
1192 浏览

php - 运行线程时使用 pcntl_signal 关闭 php 进程

运行线程时,使用 注册的函数pcntl_signal永远不会被触发。

然后,在终端中:

没有线程时工作正常:

在运行线程时发送 SIGTERM 时如何执行一些代码?我正在使用:php-5.6.7、pthreads-2.0.10、debian-7

0 投票
2 回答
43441 浏览

windows - 如何在 Windows 中安装 PCNTL 扩展?

我在 Windows 中运行 PHPUnit 并尝试通过composer.json安装 PHPUnit :

...具有这种依赖性,但我收到此错误:

phpunit/php-invoker 1.1.3 需要 ext-pcntl * -> 您的系统中缺少请求的 PHP 扩展 pcntl。

如何安装此扩展程序?

0 投票
2 回答
1193 浏览

php - php 信号未立即处理

我有一个用 PHP 编写的软件,可以运行很长时间,它是通过命令行(不是 Web 应用程序)启动的。我想确保在软件退出时调用一个函数,包括通过 ctrl+c 杀死时。当被信号杀死时,不会调用关闭函数(通过 register_shutdown_fucntion() 注册的析构函数和函数)。

经过一番阅读,我意识到我必须在每个相关信号上添加一个处理程序才能调用“exit;”。这样做解决了我的问题并且有效。

我的问题是,在某些情况下,信号没有立即处理。它可能需要几秒钟,几分钟,在某些情况下,根本不处理。就像从未到达处理程序代码一样。我真的不知道从哪里开始调试。我尝试过其他信号(sigkill、sighup 等),行为相同。

我的代码带有这些括号

我找不到立即治疗的时间和不接受治疗的时间之间的任何相关性。

任何帮助,将不胜感激。

0 投票
1 回答
2606 浏览

php - 安装了 pcntl 的未定义 pcntl_signal_dispatch()

我在pcntlubuntu 服务器虚拟机上使用很麻烦。
我有一个 PHP 脚本制作线程来做重复的事情。
我的服务器有 PHP 的 pcntl 扩展。

使用命令php -me输出:

calendar
ctype
curl
date
dom
filter
hash
iconv
json
libxml
mbstring
mysql
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
posix
Reflection
session
shmop
SimpleXML
SPL
SQLite
standard
tokenizer
xml
xmlreader
xmlwriter
zip
zlib

我在代码中添加了日志,所以我确定pcntl_forkpcntl_wait并且pcntl_wexitstatus由脚本执行。
但在使用线上pcntl_signal_dispatch(),它因错误而崩溃:

调用未定义函数 pcntl_signal_dispatch()

欢迎任何线索:)

0 投票
1 回答
406 浏览

php - 从 wexitstatus 收到错误的退出代码

我正在使用 PCNTL 在 ubuntu 服务器上多处理 PHP 中的大脚本。
这是代码(简化和注释)

我面临的问题是关于 wexitstatus 返回的值。
为了简单起见,有一个父进程,它必须创建 200 个线程。
他一次创建一个进程,如果实际运行的线程超过 8 个,则等待一个进程完成。
我添加了许多日志,所以我看到一个孩子完成了它的工作。
我看到它在打电话posix_kill($pidChild, 10);
我看到信号处理程序被调用signal user 1(导致exit(0))。
我看到父亲醒来,但是当他从 获取返回的代码时wexitstatus,他看到了代码 3,因此认为孩子出错了,而它已经以代码 0 退出!!。
pid 是好孩子的 pid。
也许我误解了信号是如何工作的......有什么线索吗?