我目前的代码(见下文)使用147MB的虚拟内存! 我的提供程序默认分配了100MB,一旦运行就会终止进程,从而导致内部错误。 该代码使用curl multi,并且必须能够循环超过150次迭代,同时仍然最小化虚拟内存。下面的代码仅设置为150次迭代,仍然会导致内部服务器错误。在90次迭代时,问题不会发生。
如何调整代码以降低资源使用/虚拟内存?
谢谢!
<?php
function udate($format, $utimestamp = null) {
if ($utimestamp === null)
$utimestamp = microtime(true);
$timestamp = floor($utimestamp);
$milliseconds = round(($utimestamp - $timestamp) * 1000);
return date(preg_replace('`(?<!\\\\)u`', $milliseconds, $format), $timestamp);
}
$url = 'https://www.testdomain.com/';
$curl_arr = array();
$master = curl_multi_init();
for($i=0; $i<150; $i++)
{
$curl_arr[$i] = curl_init();
curl_setopt($curl_arr[$i], CURLOPT_URL, $url);
curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_arr[$i], CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl_arr[$i], CURLOPT_SSL_VERIFYPEER, FALSE);
curl_multi_add_handle($master, $curl_arr[$i]);
}
do {
curl_multi_exec($master,$running);
} while($running > 0);
for($i=0; $i<150; $i++)
{
$results = curl_multi_getcontent ($curl_arr[$i]);
$results = explode("<br>", $results);
echo $results[0];
echo "<br>";
echo $results[1];
echo "<br>";
echo udate('H:i:s:u');
echo "<br><br>";
usleep(100000);
}
?>
答案 0 :(得分:2)
根据您的上一次评论..
希望这足以让你的API充满活力。
<?php
$url = '________';
$fetch_count = 150;
$window_size = 5;
require("RollingCurl.php");
function request_callback($response, $info, $request) {
list($result0, $result1) = explode("<br>", $response);
echo "{$result0}<br>{$result1}<br>";
//print_r($info);
//print_r($request);
echo "<hr>";
}
$urls = array_fill(0, $fetch_count, $url);
$rc = new RollingCurl("request_callback");
$rc->window_size = $window_size;
foreach ($urls as $url) {
$request = new RollingCurlRequest($url);
$rc->add($request);
}
$rc->execute();
?>
通过查看问题,我看到this comment:
如果意图是抢夺域名, 然后使用已建立的一个 服务是一个更好的选择。您的 脚本实现很难 重要的是作为实际的连接和 等待时间。
我同意这个评论。
另外,您似乎已经发布了“相同的问题”大约 七百次 :
https://stackoverflow.com/users/558865/icer
https://stackoverflow.com/users/516277/icer
How can I adjust the server to run my PHP script quicker?
How can I re-code my php script to run as quickly as possible?
How to run cURL once, checking domain availability in a loop? Help fixing code please
Help fixing php/api/curl code please
How to reduce virtual memory by optimising my PHP code?
Overlapping HTTPS requests?
Multiple https requests.. how to?
事实上你不得不一遍又一遍地问同一个问题,告诉你you're doing it wrong吗?
This comment你的:
@mario:干杯。我正在竞争 其他2家公司具体 国家代码顶级域名的。他们是游戏新手 他们正在抢购这些领域 慢的时间(最多10秒后) 清除时间)。我只是慢一点 此刻。
我很相信,如果你真的试图击败两家公司来抢购过期的域名,那么共享主机帐户上的PHP是错误的工具。
答案 1 :(得分:0)
150个查询中的每个查询的结果都存储在PHP内存中,根据您的证据,这是不够的。唯一的结论是你不能在内存中保留150个查询。您必须有一种流式传输到文件而不是内存缓冲区的方法,或者只是减少查询次数并批量处理URL列表。
要使用流,您必须将CURLOPT_RETURNTRANSFER
设置为0并实现CURLOPT_WRITEFUNCTION
的回调,PHP手册中有一个示例:
http://www.php.net/manual/en/function.curl-setopt.php#98491
function on_curl_write($ch, $data)
{
global $fh;
$bytes = fwrite ($fh, $data, strlen($data));
return $bytes;
}
curl_setopt ($curl_arr[$i], CURLOPT_WRITEFUNCTION, 'on_curl_write');
在回调中获取正确的文件句柄是读者难以解决的问题。
答案 2 :(得分:0)
<?php
echo str_repeat(' ', 1024); //to make flush work
$url = 'http://__________/';
$fetch_count = 15;
$delay = 100000; //0.1 second
//$delay = 1000000; //1 second
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
for ($i=0; $i<$fetch_count; $i++) {
$start = microtime(true);
$result = curl_exec($ch);
list($result0, $result1) = explode("<br>", $result);
echo "{$result0}<br>{$result1}<br>";
flush();
$end = microtime(true);
$sleeping = $delay - ($end - $start);
echo 'sleeping: ' . ($sleeping / 1000000) . ' seconds<hr />';
usleep($sleeping);
}
curl_close($ch);
?>