问题标签 [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.
multithreading - 开发 CLI 应用程序/脚本的最佳/流行库是什么?
我熟悉的许多组件库和工具包都缺少特定于 CLI 的库(zend、kohana 等)。是否有专门为开发 CLI 应用程序而设计的库/工具(例如 php 的多线程库的抽象,pcntl/posix)?
php - 使用 pcntl_fork() 提高 HTML 抓取效率
在前两个问题的帮助下,我现在有了一个可以将产品信息输入数据库的 HTML 抓取工具。我现在要做的是通过让我的刮刀使用pcntl_fork
.
如果我将我的 php5-cli 脚本分成 10 个单独的块,我会大大提高总运行时间,所以我知道我不受 i/o 或 cpu 限制,而只是受到我的抓取函数的线性性质的限制。
使用我从多个来源拼凑的代码,我有这个工作测试:
这提出了以下问题:
1) 鉴于我的 hrefArray 包含 4 个 url - 如果该数组包含 1,000 个产品 url,则此代码会产生 1,000 个子进程?如果是这样,将进程数量限制为 10 个的最佳方法是什么,再以 1,000 个 url 为例,将子工作负载拆分为每个孩子 100 个产品 (10 x 100)。
2)我了解到 pcntl_fork 创建了流程和所有变量、类等的副本。我想做的是用 DOMDocument 查询替换我的 hrefArray 变量,该查询构建要抓取的产品列表,然后提供它们让子进程进行处理 - 因此将负载分散到 10 个童工身上。
我的大脑告诉我需要执行以下操作(显然这不起作用,所以不要运行它):
但是我不知道如何仅在主/父进程中构建我的 hrefsArray[] 并将其提供给子进程。目前我尝试过的一切都会导致子进程中的循环。即我的 hrefsArray 在主进程和每个后续子进程中构建。
我敢肯定,这一切都完全错误,因此非常感谢您朝着正确的方向进行总体推动。
php - PHP:pcntl_alarm() 和 socket_select() 可以和平地存在于同一个线程中吗?
我有一个主要编写的 PHP CLI 脚本,它用作聊天服务器以供聊天客户端连接(不要问我为什么要在 PHP 中这样做,那是另一个故事哈哈)。
我的脚本利用 socket_select() 函数挂起执行,直到套接字上发生某些事情,此时它唤醒,处理事件,并等待下一个事件。现在,我需要每 30 秒左右执行一些例行任务(检查是否应该解除临时禁止用户,保存用户数据库,其他各种事情)。
据我所知,PHP 根本没有很好的多线程支持。我的第一个想法是每次套接字生成事件并让程序再次流动时比较时间戳,但这非常不一致,因为服务器很可能会闲置几个小时而没有执行我的任何清理例程。
我遇到了 PHP pcntl 扩展,它让我可以使用为发送 SIGALRM 分配一个时间间隔,并在每次发送时执行一个函数。这似乎是我的问题的理想解决方案,但是 pcntl_alarm() 和 socket_select() 相互冲突非常糟糕。每次触发 SIGALRM 时,我的套接字控制代码都会发生各种疯狂的事情。
我的程序相当长,所以我不能在这里全部发布,但这没关系,因为我不相信我在代码方面做错了什么。我的问题是:有什么方法可以在与等待的 socket_select() 相同的线程中处理 SIGALRM?如果是这样,怎么做?如果没有,我的选择是什么?
这是我的程序的一些输出。我的警报功能只是输出“滴答声!” 每当它被调用时,就可以很容易地判断事情何时发生。这是允许它打勾 4 次后的输出(包括错误)(尽管它说了什么,但没有实际尝试连接到服务器):
[05-28-10 @ 20:01:05] 聊天服务器在 192.168.1.28 端口 4050 上启动
[05-28-10 @ 20:01:05] 从文件中加载了 2 个用户
PHP 通知:未定义的偏移量:0 in /home/danny/projects/PHPChatServ/ChatServ.php 第 112 行
PHP 警告:socket_select():无法选择 [4]:第 116 行 /home/danny/projects/PHPChatServ/ChatServ.php 中的系统调用中断
[05-28-10 @ 20:01:15] 打勾!
PHP 警告:socket_accept():无法接受传入连接 [4]:第 126 行 /home/danny/projects/PHPChatServ/ChatServ.php 中的系统调用中断
[05-28-10 @ 20:01:25] 打勾!PHP 警告:socket_getpeername() 期望参数 1 是资源,布尔值在第 129 行的 /home/danny/projects/PHPChatServ/ChatServ.php 中给出
[05-28-10 @ 20:01:25] 接受来自 PHP 的套接字连接 注意:未定义的偏移量:第 112 行 /home/danny/projects/PHPChatServ/ChatServ.php 中的 1
PHP 警告:socket_select():无法选择 [4]:第 116 行 /home/danny/projects/PHPChatServ/ChatServ.php 中的系统调用中断
[05-28-10 @ 20:01:35] 打勾!
PHP 警告:socket_accept():无法接受传入连接 [4]:第 126 行 /home/danny/projects/PHPChatServ/ChatServ.php 中的系统调用中断
[05-28-10 @ 20:01:45] 打勾!
PHP 警告:socket_getpeername() 期望参数 1 是资源,布尔值在第 129 行的 /home/danny/projects/PHPChatServ/ChatServ.php 中给出
[05-28-10 @ 20:01:45] 接受来自的套接字连接
PHP 通知:未定义的偏移量:/home/danny/projects/PHPChatServ/ChatServ.php 第 112 行中的 2
php - pcntl_fork() 函数
因为爬网可能会花费大量时间,所以我想让 pcntl_fork() 帮助我创建多个子项以将我的代码分成几部分。
- 大师——爬取域
- 孩子 - 收到链接时,孩子必须抓取在域上找到的链接
- 孩子 - 接收新链接时必须与 2. 相同。
我可以尽可能多地制作,还是我必须设置最多的孩子?
这是我的代码:
忘了说:我需要一个 WIN x(86) 32 位解决方法!
因为我的客户端不支持它。
php - 长 PHP SOAP 过程
我一直在开发一个通过 SOAP 获取所有数据的网站。某些页面可能对soap 服务器进行了三到四次调用,并且某些调用有时可能需要很长时间(30-60 秒)。
我注意到发生的事情是,如果我在一个 30 秒的长调用期间中断请求(停止浏览器加载)并向不需要很长时间的调用发出另一个请求(使用较短的调用加载另一个 URL)我不在初始呼叫的 30 秒结束之前(或者看起来如此),不会收到请求。
这里到底发生了什么,有办法解决吗?
这是 pcntl 可以帮助减轻的吗?
此外,我希望通过 Nginx 使用 FPM 设置 PHP。这会影响事情吗?
谢谢大家!
php - shell_exec php文件
我目前使用此代码:
在我的 content.php 中,我有以下代码:
现在我想通过填写表单并提交它来查看我的 shell_exec 是否真的有效:但它根本没有回显任何内容。
我写错代码了吗?
php - 如何使用 pcntl_waitpid() 返回的 $status?
我正在进行父母/工人安排。父进程将工作进程 PID 保存在一个数组中,并通过以下循环不断检查它们是否还活着:
问题是它pcntl_waitpid()
总是设置$status
为 0,所以第一次运行这个循环时,父级认为它的所有子级都正常退出,即使它们仍在运行。我是在pcntl_waitpid()
错误地使用,还是期望它做一些它没有做的事情?
php - pcntl_wifexited 总是返回 true
好吧,子进程可能会因错误而退出,但 pcntl_wifexited 总是返回 true
我可能会使用该信号来查找错误,但我不明白 pcntl_wifexited() 有什么问题。
这与WNOHANG
选项有关吗?
php - 为什么在 prod-serv 上不鼓励在 php 中使用 pcntl 库?
谁能告诉我为什么不鼓励在生产服务器上使用 pcntl 库?PHP 手册对此进行了非常简短的介绍,我迫切需要使用这个库......在 php 中是否有另一种方法可以做同样的事情?
php - php分叉问题
我有以下测试 php 来执行 fork/spawn 过程,其中测试还尝试在完成后杀死子进程(僵尸)..
我希望有一个更高效的流程,其中任何子流程都会尽快从流程表中删除。当前尝试填满进程表,并导致关闭系统的内存分配问题。该应用程序在 Fedora/Centos 系统上运行。
当它运行时我遇到了内存分配错误,并且在它们被删除之前产生了太多的进程。
在此感谢任何指针将不胜感激..
更新::: 设法得到我认为的解决方案.....