Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Cron作业很快就会耗尽内存_Php_Cron - Fatal编程技术网

Php Cron作业很快就会耗尽内存

Php Cron作业很快就会耗尽内存,php,cron,Php,Cron,我在godaddy共享主机上托管。我的数据库有500多个条目,但随着时间的推移,我希望它会更高。也许成千上万。我将它作为cron作业运行,但仅在33条记录之后,它就耗尽了内存(64兆)。我无法更改最大内存,因为我使用共享主机。我能做些什么来减少内存使用吗?也许有什么方法可以在每次循环时清除内存 include('simple_html_dom.php'); $html = new simple_html_dom(); $price_query = mysql_query("SELECT *

我在godaddy共享主机上托管。我的数据库有500多个条目,但随着时间的推移,我希望它会更高。也许成千上万。我将它作为cron作业运行,但仅在33条记录之后,它就耗尽了内存(64兆)。我无法更改最大内存,因为我使用共享主机。我能做些什么来减少内存使用吗?也许有什么方法可以在每次循环时清除内存

include('simple_html_dom.php');
$html = new simple_html_dom();  

$price_query = mysql_query("SELECT * FROM prices");
while ($price_rows = mysql_fetch_assoc($price_query))
{
$vendor_id = $price_rows['vendor_id'];
$product_id = $price_rows['product_id'];
$product_page = $price_rows['product_page'];
$product_string = $price_rows['product_string'];
$product_array = $price_rows['product_array'];

if (urlOK($product_page))
    {
    $html = file_get_html($product_page);  

    $new_price = $html->find($product_string); 
    $new_price = preg_replace('/[\$,]/', '', $new_price);
    $product_price = $new_price[$product_array];
    $product_price = strip_tags($product_price);

    $qry="UPDATE prices SET product_price='$product_price' WHERE product_id = '$product_id' AND vendor_id = '$vendor_id'";
    mysql_query($qry);
    }

else
    {
    $qry="UPDATE prices SET product_price='0.00' WHERE product_id = '$product_id' AND vendor_id = '$vendor_id'";
    mysql_query($qry);
    }

$vendor_id = null;
$product_id = null;
$product_page = null;
    $product_string = null;
    $product_array = null;
$qry = null;
$html = null;
}
这是我正在调用的1函数:

function urlOk($url) 
{
    $headers = @get_headers($url);
    if($headers[0] == 'HTTP/1.1 200 OK') return true;
    else return false;
}

好吧,经过几个小时的研究,我已经找到了答案。问题本身存在于simple_html_dom库中。如果在循环中使用,会出现大量内存泄漏。要修复此问题,只需将其添加到循环的末尾:

$html->clear();
unset($html);   

可以,在查询中使用
限制
偏移
。目前,您正在尝试一次性将所有记录加载到内存中—以块的形式加载记录,这样会更节省内存。@halfer这样做的好处是什么?我没有看到内存泄漏。我将使用
xdebug
分析脚本,他使用
mysql\u fetch\u assoc()
一次只读取一行,他没有将整个结果读取到内存中。@halfer他在循环中使用
fetch\u assoc
,从而一次返回一行,然后继续下一行。使用限制在这里不会起任何作用。我以为我一次只处理一行。经过33次循环后,虽然我的内存超过了64兆。无论我改变什么,它总是在33次记录后失败。