2011-02-14 2 views
11

특정 URL에서 컬을 실행하면 사이트에서 응답을 멈추고 오류보고가 켜져 있음에도 불구하고 오류가 생성되지 않습니다. 컬링 타임 아웃을 낮은 값으로 설정하려고 시도했지만 오류가 발생하여 시간이 초과되지 않습니다.curl_exec는 PHP 스크립트가 아무 작업도하지 못하도록합니다.

내가 알고 싶은 가장 중요한 사실은 그 일이 어떻게 일어날 수 있으며 어떻게 그 이유를 알 수 있습니까?

내가 액세스하려고 해요 URL이 사실에 입각 한 API를 호출하고, URL을 내가 여기에 사용하고

(http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters= { "카테고리": "자동차", "$ loc를" { "$ within": { "$ center": [[41, -74], 80467.2]}})

브라우저에 넣을 때 작동합니다. PHP 스크립트는 위도와 경도를 근본적으로 다른 값으로 변경하면 의도 한대로 작동합니다.

error_reporting(E_ALL); 
ini_set('display_errors', '2'); 
$url="http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters={\"category\":\"Automotive\",\"\$loc\":{\"\$within\":{\"\$center\":[[41,-74],80467.2]}},\"website\":{\"\$blank\":false}}"; 
Echo "\n\n1"; 

$ch = curl_init($url); 
Echo 2; 
curl_setopt($ch, CURLOPT_HEADER, 0); 
Echo 3; 
curl_setopt($ch, CURLOPT_POST, 1); 
Echo 4; 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,15); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT,30); 
Echo 5; 
$output = curl_exec($ch) or die("hhtrjrstjsrjt".curl_error($ch)); 
Echo 6; 
curl_close($ch); 
Echo "out: ".$output; 
+6

다른 사용자 에이전트를 설정해보십시오. 우리는 이전에 스패밍 문제를 겪었고 우리가 싫어하는 사용자 에이전트로 흥미로운 일을합니다. –

+2

또한 API 키를 게시하는 것이 좋습니다. – DFectuoso

+3

'$ output = curl_exec ($ ch) 또는 die ("hhtrjrstjsrjt".curl_error ($ ch));는 예상 한대로 수행하지 않습니다. 기본적으로'$ output = (curl_exec ($ ch) or die ("hhtrjrstjsrjt".curl_error ($ ch)));를 실행하면 문자열 대신 부울 값이 반환됩니다. 대신 오류 검사를 다음 행으로 이동하거나 다음과 같이 명시 적으로 그룹화하십시오.'($ output = curl_exec ($ ch)) 또는 die ("hhtrjrstjsrjt".curl_error ($ ch));' – ircmaxell

답변

1

이 코드는 코드 내 내 경우

<?php 

$useragent = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) 
Chrome/8.0.552.224: Safari/534.10'; // notice this 
$url="http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters={\"category\":\"Automotive\",\"\$loc\":{\"\$within\":{\"\$center\":[[41,-74],80467.2]}},\"website\":{\"\$blank\":false}}"; 
$ch = curl_init(); // notice this 

curl_setopt($ch, CURLOPT_URL, $url); // notice this 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 




$contents = curl_exec($ch); 
echo $contents; 
?> 
+7

집에서 따라 다니는 사람들을 위해 .. 당신이 무엇을 바꿨는지, 왜 그것을 바꿨는지 설명하면 좋을 것입니다. 사이트에서 아주 오랜 시간 동안 다른 사람들에 의해 발견됩니다. 어쩌면 몇 달 후, 비슷한 문제가 있고 그것을 배우고 싶습니다. :) 고마워요. –

+0

또한 큰 따옴표를 사용하여이 작업을 수행합니다. 즉, 곱슬 팔로워는 PHP의 변수에 대한 것입니다. URL의 매개 변수를 URL 인코딩해야합니까? –

2

컬 실패가 호스팅 제공 업체가 LiteSpeed를 아파치를 대체했다는 사실 때문에 따라, 수정, 단지 테스트이며, litespeed는 컬 요청 중에 프로세스를 종료하고있었습니다.

lsphp가 매 30 초마다 종료되었으므로 php.ini 설정으로이 문제가 해결되지 않았습니다.

우리는 오랫동안 채팅을했고, 나는 그들의 서버가 실제로 깨졌습니다 (결국)라고 확신했습니다. 오류 로거를 포함하여 전체 PHP 프로세스가 존재했기 때문에가
내 PHP 스크립트가 실행하고, 오류가 PHP에 기록되고 있었다 :

는 유사하거나 관련된 문제가있을 수 있습니다 다른 사람들이 명확하게하려면 웹 서버에 의해 종료됩니다.

2

CURL은 외부 응용 프로그램이므로 URL이 url_encoded가 아닙니다. 브라우저가 url_encode URL을 자동으로 url_encode 매개 변수를 사용하지만 서버의 컬이 깨져서 멈출 수 있습니다.

변경해보십시오이 :

$url="http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters={\"category\":\"Automotive\",\"\$loc\":{\"\$within\":{\"\$center\":[[41,-74],80467.2]}},\"website\":{\"\$blank\":false}}"; 

에 :

$url_filters = '{"category":"Automotive","$loc":{"$within":{"$center":[[41,-74],80467.2]}},"website":{"$blank":false}}'; 

$url="http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters=".urlencode($url_filters); 

그러나 내가 어떤 질문 전화가 정확해야합니까? 리터럴 "$ loc"의 열쇠가 맞습니까?

는 변수가 대체 지원하지 않는 모든 작은 따옴표를 백 슬래시의 필요성을 제거하도록 업데이트하고 그들에게 내가 전에 바닐라 PHP에서 CURL 통화 일한

2

을 탈출하지 않고 따옴표 수 있습니다. CURL 호출은 curl 클래스의 일부입니다. 다른 사용자가 제안한대로 url_encode($url) 함수는이 특정 클래스에서 사용할 문자열을 준비합니다. 이것을 실행하지 않으면 핸들러를 깨뜨릴 수있는 URL을 전달할 수 있습니다 (예 : 잘못된 문자 또는 URL 구문이 있음).

이 외에도 JSON 개체를 페이지의 URL로 직접 전달하는 것으로 보입니다. 이와 같이 컬 (curl) 호출로 JSON 패키지를 사용하는 것이 가장 좋은 방법이라고 생각하지 않습니다. 이것이 당신이하고자하는 것이라면,이 페이지를보십시오 : How to POST JSON data with Curl from Terminal/Commandline to Test Spring REST?

3

PHP 설정 파일에 실수가있는 것처럼 보입니다.

오류를 수정하려면 php.ini 파일을 수정해야합니다.

개발 모드에서 오류를 표시하려면 error_reporting 값을 E_ALL으로 변경하십시오.

error_reporting=E_ALL 

그런 다음 cURL 확장을 사용하도록 설정해야합니다. 이 값을 편집하면

extension=php_curl.dll 

하면, 웹 서버 (Apache 또는 Nginx에) 또한

I를 다시 시작하는 것을 잊지 마세요 : 다음 줄의 주석 php.ini 파일에서 그것을, 통 더 가지고 사용하려면 제 동료와 동의하면 url_encode JSON 문자열을 사용해야합니다. 내 관점에서

코드가 있어야한다 :

<?php 
ini_set('display_errors', '1'); 
error_reporting(E_ALL); 

$apiKey = '*apikey*'; 
$filters = '{"category":"Automotive","$loc":{"$within":{"$center":[[41,-74],80467.2]}},"website":{"$blank":false}}'; 
$params = '?api_key=' . $apiKey . '&filters=' . url_encode($filters); 

$url = 'http://api.factual.com/v2/tables/bi0eJZ/read'; 
$url .= $params; 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
$output = curl_exec($ch) or die("cURL Error" . curl_error($ch)); 
curl_close($ch); 

echo "out: " . $output; 

편집 :

또 다른 방법은 사실에 입각 API에 대한 공식 PHP 드라이버를 사용할 수 : Official PHP driver for the Factual API

cURL Debug OutputException Debug Output과 함께 Debug Mode을 제공합니다. 미래의 이익을 위해

+0

감사합니다. 나는'extension = php_curl.dll'을 주석 처리하지 않았다. –

1

:

  1. 매개 변수 이 안전하지 않습니다 많은 문자/HTTP_CODE 및 에 대한 정보를 볼 수있는 URL을

  2. 사용 curl_getinfo() 유효가 포함 된 필터와 같은 쿼리 매개 변수를 사용 urlencode 기타 유용한 정보.

0

사실 스크립트가 전혀 아무것도 중지하는 것이 여기에서 그것을 발견 할 수 있습니다

http://php.net/manual/en/function.set-time-limit.php

발췌 :

set_time_limit() 함수와 설정 지시어 max_execution_time을 만 스크립트 자체의 실행 시간에 영향을줍니다. 스크립트가 실행 된 최대 시간을 결정할 때 system()을 사용하는 시스템 호출, 스트림 작업, 데이터베이스 쿼리 등과 같은 스크립트 실행 이외의 상황에서 발생하는 활동에 소요되는 시간은 포함되지 않습니다. 측정 된 시간이 실제 인 Windows에서는 그렇지 않습니다.

그래서 기본적으로 컬 블록의 모든 PHP 스크립트 및 시간 제한을 사용해야하는 이유를 영원히 블록, 귀하의 사이트가 더 응답은 뜻 이잖아 그래서 만약 기본적으로 실제로 실행되는 유일한 것은, 컬입니다 ...

을 피하는 방법으로 제한 시간을 사용하십시오 ...

+0

PHP_CURL이 호스트 시스템에서 CURL을 사용하지 않았다면 이것은 정상적으로 맞을 것입니다.'exec ("curl ....")'사용자 입력에 대한 curl halt가 아무리 기다려도 기다릴 것입니다. 오래 타임 아웃을 설정하십시오. –

관련 문제