我已经完成了所有类似的问题,没有什么能适合这个法案。
我正在运行一个大脚本,它在旧服务器上运行chron但在新服务器上运行失败,所以我正在使用浏览器进行测试。
我有两个函数,一个从数据库中提取属性,然后通过另一个函数运行它们将价格转换为4种货币,如果值不同则更新该行。功能如下:
<?php
function convert_price($fore_currency, $aft_currency, $amount)
{
echo "going into convert<br/>";
$url = "http://www.currency.me.uk/remote/ER-ERC-AJAX.php?ConvertFrom=" . $fore_currency .
"&ConvertTo=" . $aft_currency . "&amount=" . $amount;
if (!is_int((int)file_get_contents($url))) {
//echo "Failed on convert<br/>";
return false;
} else {
//echo "Conversion done";
return (int)file_get_contents($url);
}
}
function run_conversion($refno = '', $output = false)
{
global $wpdb;
$currencies = array("GBP", "EUR", "TRY", "USD");
$q = "SELECT * FROM Properties ";
$q .= (!empty($refno)) ? " WHERE Refno='" . $refno . "'" : "";
$rows = $wpdb->get_results($wpdb->prepare($q), ARRAY_A);
$currencies = array("USD", "GBP", "TRY", "EUR");
//$wpdb->show_errors();
echo "in Run Conversion " . "<br/>";
foreach ($rows as $row) {
echo "In ROw <br/>";
foreach ($currencies as $currency) {
if ($currency != $row['Currency'] && $row['Price'] != 0) {
$currfield = $currency . "_Price";
$newprice = convert_price($row['Currency'], $currency, $row['Price']);
echo "Old Price Was " . $row['Price'] . " New Price Is " . $newprice . "<br/>";
if ($newprice) {
if ($row[$currfield] != $newprice) {
$newq = "UPDATE Properties SET DateUpdated = '" . date("Y-m-d h:i:s") . "', " .
$currfield . "=" . $newprice . " WHERE Refno='" . $row['Refno'] . "'";
$newr = $wpdb->query($newq);
if ($output) {
echo $newq . " executed <br/>";
} else {
echo "query failed " . $wpdb->print_error();
}
} else {
if ($output) {
echo "No need to update " . $row['Refno'] . " with " . $newprice . "<br/>";
}
}
} else {
echo "Currency conversion failed";
}
}
}
}
}
?>
然后我为了chron而从单独的文件中运行该过程,如下所示:
require($_SERVER['DOCUMENT_ROOT'] . "/functions.php"); // page containing functions
run_conversion('',true);
如果我将mysql查询限制为100个属性,它运行正常,我在一个很好的流中获得所有输出。但是当我尝试完全运行它时脚本完成(我可以从db中更新的行中看到)但没有输出。我试过增加记忆力,但没有快乐。任何想法都感激不尽。此外,从Apache模块更改为CGI时出现500错误。关于这一点的任何想法也很受欢迎,理想情况下我想将网站转换为fastCGI。
答案 0 :(得分:0)
你的内存最有可能。可能在你的数据库层。最好的办法是在每个循环结束时取消设置迭代值:
foreach ( $rows as $row ) {
...
foreach ( $currencies as $currency ) {
...
unset( $currency, $newr, $currfield, $newprice );
}
unset( $row );
}
这肯定有帮助。
答案 1 :(得分:0)
另一个答案表明你可能内存不足,但如果每次循环运行时都进行HTTP调用,并且你有100多种货币,这也可能导致问题。例如,尝试将其限制为5种货币。
如果这确实是问题,我会拆分流程,因此一大块货币的每个cron作业都会更新各自的值,而不是一切。