我有一个在本地运行良好的脚本,但是当我尝试在网络服务器上运行它时,它无法运行并且超出了时间限制。
我有一个数组中的类别列表,其键是其ID,值是名称。 Foreach类别我调用curl命令通过外部api获取所有产品。该CURL调用的设置如下:
foreach ($categories as $key => $value) {
$url_get_products = "http://luceed.euromdenis.hr:8081/datasnap/rest/artikli/GrupaArtikla/".$key;
$cp = curl_init();
curl_setopt($cp, CURLOPT_URL, $url_get_products);
curl_setopt($cp, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($cp, CURLOPT_TIMEOUT, 20);
curl_setopt($cp, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($cp, CURLOPT_VERBOSE, TRUE);
curl_setopt($cp, CURLOPT_ENCODING, '');
curl_setopt($cp, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($cp, CURLOPT_USERPWD, $username . ':' . $password);
curl_setopt($cp, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($cp, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($cp, CURLOPT_FOLLOWLOCATION, TRUE);
curl_error($cp);
$product_result = curl_exec($cp);
curl_close($cp);
$data = json_decode($product_result, TRUE);
从那里使用$ data变量
所需的部分初始化数组$arr_temp = $data['result'][0]['artikli'];
然后输入一个循环,我检查每个产品
for ($i = 0; $i < count($arr_temp); $i++) {
由于api数据库组织不良,因此没有产品图像,因此我必须使用其他网址来获取具有正确ID的图像。
图片网址看起来像这样:
random_url.com/slike/'.$product_id.'.jpg
所以我遍历该类别中的所有产品,并使用此功能检查给定网址是否存在图像
function isUrlExist($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($code == 200){
$status = true;
}else{
$status = false;
}
curl_close($ch);
return $status;
}
如果有图像,则将产品添加到稍后从中生成csv文件的阵列中。
本地图像检查是即时完成的,但当我在服务器端运行它需要永远,当我有50-60个类别来检查每个类别有几百个产品的位置时,很容易超出时间限制并且脚本停止
是否有任何解决方案,可能有一些卷曲选项?
P.S。这是我在回复curl_info
中的错误和数据时得到的信息Failed to connect to web-domain-name.com port 80: Connection timed out<br/>
答案 0 :(得分:0)
答案是外部服务器因为请求数量而禁止从中调用脚本的ip。解决方案是禁用后被解雇我只使用卷曲一次将所有图像放入文件中,然后检查网址是否有效而不是为每个产品调用curl。无论如何,它更有意义