在循环中将文件写入webroot,“致命错误:ReflectionClass :: getProperties()”

时间:2013-09-20 08:33:33

标签: php cakephp reflection file-get-contents fwrite

我通过控制器从浏览器调用此函数:

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之后停止......

2 个答案:

答案 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每隔一段时间就会随机失败,但是它会一直重试直到它工作,现在即使有错误,我也总是得到我想要的最终结果。如果有人能够了解为什么这个命令不可靠,请告诉我。