我通过控制器从浏览器调用此函数:
function writePages($startPage)
{
for ($page=$startPage;$page<90;$page++)
{
$content=file_get_contents('http://www.websiteIamUsing.com/'.$page);
$handle=fopen('mytxtfile'.$page.'.txt','w');
fwrite($handle,$content);
fclose($handle);
}
}
出于某种原因,这将写出第一个20-some,或者有时50-some文件,但是它会停止并给我这个错误:
Warning: get_class() expects parameter 1 to be object, resource given in
/Applications/MAMP/htdocs/mysite/lib/Cake/Utility/Debugger.php on line 579
Warning: get_object_vars() expects parameter 1 to be object, resource given in
/Applications/MAMP/htdocs/mysite/lib/Cake/Utility/Debugger.php on line 585
Warning: Invalid argument supplied for foreach() in
/Applications/MAMP/htdocs/mysite/lib/Cake/Utility/Debugger.php on line 586
Warning: ReflectionObject::__construct() expects parameter 1 to be object, resource
given in /Applications/MAMP/mysite/alexmohamed/lib/Cake/Utility/Debugger.php
on line 592
Fatal error: ReflectionClass::getProperties()
[<a href='http://php.net/reflectionclass.getproperties'>reflectionclass.getproperties</a>]:
Internal error: Failed to retrieve the reflection object in
/Applications/MAMP/htdocs/mysite/lib/Cake/Utility/Debugger.php on line 594
任何人都可以向我解释这里发生了什么吗?既然它开始工作,我怀疑CakePHP可能不允许你运行脚本超过一定的时间或什么?有没有解决的办法?这是一个控制器动作,只有我会使用...它不会被网站的用户使用,因此可能需要很长时间(这个应该花费大约一分钟)。
编辑:如果您查看错误,它似乎正在尝试调试某些内容,但由于cakePHP将“资源”而不是“对象”传递给调试器,因此它赢了“告诉我真正的错误。为什么这将是一个不可靠的行动...有时它会一直持续到最后,有时它会在~20个文件之后停止,有时会在~50之后停止......
答案 0 :(得分:0)
好吧,Debugger
不是发出错误的人,但通常在出现问题时,蛋糕会尝试打印出一些变量供您查看,这就是调试器抱怨的原因(当它不能正确打印出变量)
此外,file_get_contents
并不总能保证您所需的数据可能页面大小太大(内存耗尽),或远程服务器失败/阻止某些请求,尤其是您运行for循环所以快。
您可以尝试的一种方法是使用curl
抓取网页?
(参考:php file_get_contents fails sometimes during cronjob)
$fh = fopen('mytxtfile'.$page.'.txt', 'w');
$ch = curl_init('http://www.websiteIamUsing.com/'.$page);
curl_setopt($ch, CURLOPT_FILE, $fh);
#curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); //in case remote server is in https and you want to skip the ssl verification
#curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //in case remote server is in https and you want to skip the ssl verification
curl_exec($ch);
curl_close($ch);
fclose($fh);
# usleep(500000); and perhaps a 500ms sleeping gap?
尝试看看你是否得到更好的结果;)
答案 1 :(得分:0)
谢谢大家......这两条建议都很有帮助。我升级到2.4.1并且Cake不再向调试器发送资源,所以我能够看到真正的错误,这只是file_get_contents失败了。所以我将for循环更改为while循环,如下所示:
$page=1;
$pages=90;
while ($page<=$pages)
{
if($content=file_get_contents('http://www.websiteIamUsing.com/'.$page))
{
$handle=fopen('mytxtfile'.$page.'.txt','w');
fwrite($handle,$content);
fclose($handle);
$page++;
}
}
仍然存在错误,因为file_get_contents每隔一段时间就会随机失败,但是它会一直重试直到它工作,现在即使有错误,我也总是得到我想要的最终结果。如果有人能够了解为什么这个命令不可靠,请告诉我。