foreach 通过 curl 函数循环 运行
foreach loop running through curl function
为了这个愚蠢的问题,我已经挠头好几天了。
我从数据库中提取了一个名为 $url_array 的 url 数组,就像这样 -
Array (
[id] => 2
[url] => http://example.com
)
我有一个 foreach 循环,它运行在 $url_array 上,并像这样从 url 中抓取数据 -
foreach ($url_array as $row) {
$data = $this->scrapePage($row["url"]);
print_r($data);
return false;
}
目前 $data 没有输出任何内容。但是,如果我将 $row["url"] 替换为 http://example.com,则刮擦会正确发生。
这是我第一次在 DigitalOcean 上托管这个脚本,所以我不确定是否有任何服务器技术问题可能会阻止 foreach 循环工作。
编辑:
这是 scrapePage 函数 -
private function scrapePage($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Charset: utf-8'));
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$content = curl_exec($ch);
$header = curl_getinfo($ch);
curl_close($ch);
return array("header" => $header, "content" => $content);
}
就像我说的,如果我在那里手动输入 url,它工作正常,只是在循环中时不行。
至于$url_array,这是我打印出来的结果-
Array
(
[0] => Array
(
[id] => 41
[url] => http://www.example1.com
)
[1] => Array
(
[id] => 85
[url] => http://test-url-2.com
)
)
我也试过对数据进行 for 循环。如果我将 scrapePage 函数修改为 return the $url,它 returns the $url 正确。
你的 $url_array 是嵌套的,你应该尝试按照以下方法获取 url 并使用你的 scrapePage 函数:
foreach ($url_array as $row => $value) {
foreach ($value as $row => $value) {
if($row === 'url') {
//$urls[]=$value;
$data = $this->scrapePage($value);
print_r($data);
}
}
}
经过一番头痛之后,我找到了问题所在。我的 url 数据库是这样的 -
http://www.example1.com\r
http://www.example2.com\r
http://www.example3.com\r
http://www.example4.com\r
请注意末尾的“\r”,这会弄乱 cURL。我原以为给我的数据库是干净的。显然不是!我刚刚删除了所有尾随的 \r,所有代码都按预期工作。
为了这个愚蠢的问题,我已经挠头好几天了。
我从数据库中提取了一个名为 $url_array 的 url 数组,就像这样 -
Array (
[id] => 2
[url] => http://example.com
)
我有一个 foreach 循环,它运行在 $url_array 上,并像这样从 url 中抓取数据 -
foreach ($url_array as $row) {
$data = $this->scrapePage($row["url"]);
print_r($data);
return false;
}
目前 $data 没有输出任何内容。但是,如果我将 $row["url"] 替换为 http://example.com,则刮擦会正确发生。
这是我第一次在 DigitalOcean 上托管这个脚本,所以我不确定是否有任何服务器技术问题可能会阻止 foreach 循环工作。
编辑: 这是 scrapePage 函数 -
private function scrapePage($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Charset: utf-8'));
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$content = curl_exec($ch);
$header = curl_getinfo($ch);
curl_close($ch);
return array("header" => $header, "content" => $content);
}
就像我说的,如果我在那里手动输入 url,它工作正常,只是在循环中时不行。
至于$url_array,这是我打印出来的结果-
Array
(
[0] => Array
(
[id] => 41
[url] => http://www.example1.com
)
[1] => Array
(
[id] => 85
[url] => http://test-url-2.com
)
)
我也试过对数据进行 for 循环。如果我将 scrapePage 函数修改为 return the $url,它 returns the $url 正确。
你的 $url_array 是嵌套的,你应该尝试按照以下方法获取 url 并使用你的 scrapePage 函数:
foreach ($url_array as $row => $value) {
foreach ($value as $row => $value) {
if($row === 'url') {
//$urls[]=$value;
$data = $this->scrapePage($value);
print_r($data);
}
}
}
经过一番头痛之后,我找到了问题所在。我的 url 数据库是这样的 -
http://www.example1.com\r
http://www.example2.com\r
http://www.example3.com\r
http://www.example4.com\r
请注意末尾的“\r”,这会弄乱 cURL。我原以为给我的数据库是干净的。显然不是!我刚刚删除了所有尾随的 \r,所有代码都按预期工作。