莫名其妙,CPU负责特别高。而且下面代码执行的Job执行了好几天,硬是没有结束。为什么程序会结束不了?
整个代码里就只有这个循环,所以应该是下面的do-while
没有结束的问题。但为什么会结束不了呢?我怀疑是running
始终大于0。会有这种情况吗?
<?php
public function run()
{
$mh = curl_multi_init();
foreach ($this->_serverList as $key => $hostname) {
$url = "http://{$hostname}:8360/MonitorInterfaceJob.php?interval=" . $this->_timeInterval;
$ch[$key] = curl_init($url);
curl_setopt($ch[$key], CURLOPT_HEADER, 0);
curl_setopt($ch[$key], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch[$key]);
}
//这里有个循环
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
foreach ($this->_serverList as $key => $hostname) {
curl_multi_remove_handle($mh, $ch[$key]);
}
curl_multi_close($mh);
}
对比官方参考的代码:
$active = null;
// 执行批处理句柄
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
做了如下推断:
running
都是作为程序判断逻辑的。只是官方推荐的代码,严格按照libcurl来执行。curl_multi
通过select()
还是poll()
的方式做调用,我先不做区分。但我理解这种方式,等价于一个长轮询,所以CPU消耗的比较客观。请大家帮忙分析分析
大话西游666
慕田峪4524236