pcntl_fork()函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pcntl_fork()函数相关的知识,希望对你有一定的参考价值。
因为抓取网页可能会耗费大量时间,所以我想让pcntl_fork()帮助我创建多个子节点来分割我的代码。
- 大师 - 抓取域名
- 子级 - 收到链接时,子级必须抓取域中找到的链接
- 孩子 - 在接收新链接时必须与2.相同。
我可以尽可能多地制作,或者我是否必须设置最多的孩子?
这是我的代码:
class MyCrawler extends phpCrawler
{
function handlePageData(&$page_data)
{ // CHECK DOMEIN
$domain = $_POST['domain'];
$keywords = $_POST['keywords'];
//$tags = get_meta_tags($page_data["url"]);
//$iKeyFound = null;
$find = $keywords;
$str = file_get_contents($page_data["url"]);
if(strpos($str, $find) == true && $page_data["received"] == true)
{
$keywords = $_POST['keywords'];
if($page_data["header"]){
echo "<table border='1' >";
echo "<tr><td width='300'>Status:</td><td width='500'> ".strtok($page_data["header"], "
")."</td></tr>";}
else "<table border='1' >";
// PRINT EERSTE LIJN
echo "<tr><td>Page requested:</td><td> ".$page_data["url"]."</td></tr>";
// PRINT STATUS WEBSITE
// PRINT WEBPAGINA
echo "<tr><td>Referer-page:</td><td> ".$page_data["referer_url"]."</td></tr>";
// CONTENT ONTVANGEN?
if ($page_data["received"]==true)
echo "<tr><td>Content received: </td><td>".$page_data["bytes_received"] / 8 . " Kbytes</td></tr></table>";
else
echo "<tr><td>Content:</td><td> Not received</td></tr></table>";
$domain = $_POST['domain'];
$link = mysql_connect('localhost', 'crawler', 'DRZOIDBERGGG');
if (!$link)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("crawler");
if(empty($page_data["referer_url"]))
$page_data["referer_url"] = $page_data["url"];
strip_tags($str, '<p><b>');
$matches = $keywords;
//$match = preg_match_all("'/<(*.?)(*.?)>(*.?)'".$keywords."'(*.?)</($1)>/'", $str, $matches, PREG_SET_ORDER);
//echo $match;
$doc = new DOMDocument();
$doc->loadhtml($str);
$xPath = new DOMXpath($doc);
$xPathQuery = "//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), '".strtoupper($keywords)."')]";
$elements = $xPath->query($xPathQuery);
if($elements->length > 0){
foreach($elements as $element){
print "Gevonden: " .$element->nodeValue."<br />";
}}
$result = mysql_query("SELECT * FROM crawler WHERE data = '".$element->nodeValue."' ") ;
if(mysql_num_rows($result)>0)
echo 'Column already exist';
else{
echo 'added';
mysql_query("INSERT INTO crawler (id, domain, url, keywords, data) VALUES ('', '".$page_data["referer_url"]."', '".$page_data["url"]."', '".$keywords."', '".$element->nodeValue. "' )");
}
echo '<br>';
echo "<br><br>";
echo str_pad(" ", 5000); // "Force flush", workaround
flush();
}
FORGOT TO SAY:我需要一个WIN x(86)32位解决方法!
因为我的客户端不支持它。
答案
我想知道你是否会因为像Gearman这样的东西而得到更好的服务。
这是一个在你的系统上运行的作业管理器,你可以向它提交作业(如果你愿意,可以通过php),然后将它们分配给工人(再次,用php编写),然后用他们的结果报告。它非常强大和灵活,您可以让它运行更多的工作人员来处理更多的工作量。
另一答案
shell_exec做的事情,但不知道如何使用。
另一答案
看看这个:http://in.php.net/manual/en/ref.pcntl.php#37369
以上是关于pcntl_fork()函数的主要内容,如果未能解决你的问题,请参考以下文章
pcntl_fork 导致 MySQL server has gone away 解决方案
解决pcntl_fork() has been disabled for security reasons in file /www/wwwroot/192.168.21.2/vendor/wor