- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一些代码用于检查网站上的链接并尝试使其“线程化”,代码已更新为使用 pcntl_fork()。
父代码适用于 SSL 和非 SSL URL,但子代码仅适用于非 SSL URL。我在代码中指出了它有效的地方和无效的地方。
这是我的分支代码。我知道下面的代码将永远循环,我已经删除了循环控制代码以使其更具可读性。
$this->initialize_curl();
$this->connect_database();
// prime the queue
$this->add_url_to_queue($this->source_url, 0, 0);
$this->process_next_url_in_queue($this->get_next_url_in_queue());
// SSL and non-SSL work at this point
// loop until we have processed all URL's
while (1) {
$url = $this->get_next_url_in_queue();
// disconnect from the database before forking since we don't want to
// share the database connection with child processes - the first one
// will close it and ruin the fun for the other children.
curl_close($this->ch);
$this->db->close();
// create child
$pid = pcntl_fork();
// handle forked processing
switch ($pid) {
// error
case -1:
print "Could not fork\n";
exit;
// child
case 0:
// seperate database and curl for the child
$this->connect_database();
$this->initialize_curl();
// process the url
$this->process_next_url_in_queue($url);
// only non-SSL works at this point
exit;
// parent
default:
// seperate database and curl for the parent
$this->connect_database();
$this->initialize_curl();
break;
}
}
如您所见,我必须打开和关闭数据库连接才能正常工作,我正在对 CURL 做同样的事情。这是 initialize_curl()
中的代码:
$this->ch = curl_init();
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, FALSE);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($this->ch, CURLOPT_HEADER, FALSE);
我正在使用 CURLOPT_SSL_VERIFYPEER
和 CURLOPT_SSL_VERIFYHOST
因为没有它我的 SSL CURL 请求将失败。这是服务器设置的问题,我无法更改。
当子 CURL 是 SSL URL 时,我认为它失败了,因为设置这些选项时存在问题,但我不知道。如果我将 CURL 设置为详细,我会看到以下错误:
* About to connect() to HOST port 443 (#0)
* Trying IP... * connected
* Connected to HOST (IP) port 443 (#0)
* NSS error -8023
* Closing connection #0
* SSL connect error
请让我知道我可以做些什么来完成这项工作。
最佳答案
经过大量研究,我发现这个问题并不是一个新问题,而是 php 的 CURL 实现问题。这些其他问题帮助我想出了我在下面分享的解决方案:
我最后做的是使用 pcntl_exec,它用提供的命令替换当前的子进程。
$this->initialize_curl();
$this->connect_database();
// prime the queue
$this->add_url_to_queue($this->source_url, 0, 0);
$this->process_next_url_in_queue($this->get_next_url_in_queue());
// loop until we have processed all URL's
while (1) {
$url = $this->get_next_url_in_queue();
// disconnect from the database before forking since we don't want to
// share the database connection with child processes - the first one
// will close it and ruin the fun for the other children.
curl_close($this->ch);
$this->db->close();
// create child
$pid = pcntl_fork();
// handle forked processing
switch ($pid) {
// error
case -1:
print "Could not fork\n";
exit;
// child
case 0:
// seperate database and curl for the child
$this->connect_database();
$this->initialize_curl();
// process the url
pcntl_exec('process_next_url_in_queue.php', array($url));
exit;
// parent
default:
// seperate database and curl for the parent
$this->connect_database();
$this->initialize_curl();
break;
}
}
关于php - curl 和 pcntl_fork(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34901910/
我正在尝试使用 pcntl_fork() fork 命令行运行 XAMPP php 进程。当我运行以下命令时: $pid = pcntl_fork(); if($pid == -1){ fil
PHP 的 pcntl_fork 函数应该像 C 中的标准 fork 函数一样 fork 一个进程。 但我想知道这个函数是否真的 fork 了进程,或者它是否以不同的方式模拟了该行为。 如果它真的 f
我正在运行一个涉及 php+apache2 守护进程的 web 服务。所以我尝试了 pcntl_fork 函数。但是有一个问题,即使我在子进程的代码中使用了 exit(0) ,子进程也没有终止,这导致
有没有办法让 pcntl_fork 在 WAMP 中工作?我需要开发一个 fork 解决方案并在本地进行测试。 最佳答案 不,这不可能。 PCNTL扩展需要 *nix 平台。 现在,话虽如此,你想做什
我有一些代码用于检查网站上的链接并尝试使其“线程化”,代码已更新为使用 pcntl_fork()。 父代码适用于 SSL 和非 SSL URL,但子代码仅适用于非 SSL URL。我在代码中指出了它有
我正在使用 pcntl_fork 启动子进程以通过 SMTP 发送电子邮件。 子进程使用 PEAR Mail 包发送电子邮件,但问题是如果远程服务器不响应,则进程将永远运行以等待响应,而不管 php.
我理解 fork() 是如何在高层次上工作的以及 pcntl_fork() 包装器,但是出于某种原因在我的环境中 PHP 只运行 两个子一次处理。以这个简单的代码为例:
这是我的代码,在 index.php 中(只是一个例子): $pid = pcntl_fork(); if ($pid == -1) { die("failed to fork"); } else
我有 php7 CLI 守护程序,它连续解析文件大小超过 50M 的 json。我正在尝试使用带有 pcntl_fork() 的单独进程将每 1000 个已解析数据条目保存到 mysql,并且对于 ~
我在使用 php 中的 pcntl_fork() 函数时遇到一些问题。 我正在使用 XAMPP 并尝试使用该功能,但一直显示此错误: Call to undefined function pcntl_
我找遍了,脸色铁青,找不到这个问题的答案。 在哪里可以找到列出 pcntl_fork() 的所有错误代码含义的表格?甚至 C fork() 函数,就此而言。 最佳答案 似乎 12 错误代码表明没有足够
我有一些代理在运行,在正常模式下几周后,我们突然得到: 超过 300 秒的最长执行时间 在一条线上是 $this->pids[$next_child] = pcntl_fork(); 我们还有: [r
我对 pcntl_fork 感到困惑在 PHP 中。 我认为它是多线程的,但它是如何工作的以及我将如何在脚本中使用它? 最佳答案 PCNTL 无法创建线程。它只会“ fork ”当前的 PHP 进程。
我有一个 foreach 循环,它在其中 fork 。在进程 fork 后,它访问数据库。我收到一个错误: SQLSTATE[HY000]: General error: 2006 MySQL ser
在前两个问题的帮助下,我现在有了一个可以工作的 HTML 抓取工具,可以将产品信息输入数据库。我现在想做的是通过让我的刮刀与 pcntl_fork 一起工作来提高效率。 . 如果我将 php5-cli
我对 pcnt_fork 有疑问 我是按照这个教程安装的 instalation of pcntl $ mkdir /tmp/phpsource $ cd /tmp/phpsource $ apt-g
pcntl_fork() 的手册说: The pcntl_fork() function creates a child process that differs from the parent pr
我正在尝试在 php-fpm 中使用 pcntl_fork() 但它不可用,我得到: Call to undefined function pcntl_fork() 即使我在 php.ini 中注释掉
我正在开发一个使用 PHP 4.4.9 编程的嵌入式系统 - 遗憾的是没有 PCNTL 扩展。 我需要创建一个作为守护进程在后台运行的脚本。您通常会使用 fork() 来执行此操作,或者在 PHP 情
众所周知,当您 fork 时, child 会获得所有内容的副本,包括文件和网络描述符 - man fork。 在 PHP 中,当您使用 pcntl_fork 时,您使用 mysql_connect
我是一名优秀的程序员,十分优秀!