2011-02-14 12 views
11

Cuando ejecuto curl en una URL en particular, el sitio deja de responder y no genera un error, a pesar de haber configurado el informe de errores. Intenté configurar los tiempos de espera de curvatura en valores bajos, y luego genera un error, así que sé que no está caducando.curl_exec provoca que la secuencia de comandos php deje de hacer nada

Lo principal que quiero saber es, ¿cómo podría suceder eso, y cómo puedo averiguar por qué?

La url Estoy tratando de acceso es una llamada a la API de hecho, y la url que estoy usando aquí

(http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters= { "categoría": "Automoción", "$ loc": {"$ within": {"$ center": [[41, -74], 80467.2]}})

Funciona cuando lo coloca en un navegador. La secuencia de comandos php funciona según lo previsto si cambia la latitud y longitud esencialmente a cualquier otro valor.

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

Puede intentar configurar un agente de uso diferente; hemos tenido problemas de correo no deseado antes, y hacemos cosas interesantes con agentes publicitarios que no nos gustan. –

+2

Además, puede que no sea una buena idea publicar tus claves API – DFectuoso

+3

Una cosa: '$ output = curl_exec ($ ch) o die (" hhtrjrstjsrjt ".curl_error ($ ch));' no hará lo que esperas. Básicamente, está haciendo '$ output = (curl_exec ($ ch) o die (" hhtrjrstjsrjt ".curl_error ($ ch)));' en que está devolviendo un booleano en lugar de una cadena. En su lugar, mueva la comprobación de errores a la línea siguiente o agrúpela explícitamente de esta manera: '($ salida = curl_exec ($ ch)) o muere (" hhtrjrstjsrjt ".curl_error ($ ch));' – ircmaxell

Respuesta

1

este código es sólo para las pruebas, basta con modificar su código de acuerdo con mi

<?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

para aquellos de nosotros que lo sigan en su casa ... sería agradable si usted explicara qué cambió y por qué lo cambió :) Como puede notar, preguntas como esta siguen en pie en el sitio durante mucho tiempo y son encontrados por otras personas, tal vez meses después, que tienen un problema similar y quieren aprender de él :) Gracias. –

+0

también hace este trabajo su uso de comillas dobles estoy seguro de que los brazaletes son para variables en php. ¿los parámetros en la URL están URLencoded? –

2

En mi caso, el fallo de rizo se debió al hecho de que el proveedor de hosting había reemplazado Apache con Litespeed, y litespeed estaba finalizando el proceso durante la solicitud de curl.

La configuración de php.ini no solucionó esto ya que lsphp terminaba en 30 segundos cada vez.

Tuvimos una larga conversación, y los convencí de que su servidor en realidad estaba roto (eventualmente).

Para hacer esto más claro para otras personas que podrían tener un problema similar o relacionado:
Mi script PHP estaba en funcionamiento, y no hay error se estaba talando en PHP porque todo el proceso PHP, incluyendo el registrador de error estaba siendo terminado por el servidor web.

2

Tu url no está url_encodificado ya que CURL es una aplicación externa que se necesita para escaparse. Tu navegador auto url_encode params en la URL, pero puedes romper el curl en el servidor y se está deteniendo.

Intente cambiar esto:

$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}}"; 

a:

$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); 

Sin embargo tengo algunas dudas es su llamada correcta? la clave de literlal "$ loc" es correcto?

actualizado para eliminar la necesidad de barra invertida todo comillas simples no son compatibles con la variable reemplazar y permitirá comillas dobles sin escapar de ellos

2

He trabajado con llamadas rizo de PHP de vainilla antes. La llamada CURL es una parte de la clase curl. Como han sugerido otros usuarios, la función url_encode($url) prepararía la cadena para el uso de esta clase en particular. Si no ejecuta esto, podría pasar URL que romperían los controladores (por ejemplo, con caracteres no válidos o sintaxis de URL).

Además de esto, parece que está intentando pasar un objeto JSON directamente a la URL de una página. No creo que sea una buena práctica trabajar con paquetes JSON en una llamada curl como esta. Si esto es lo que está buscando hacer, vea esta página: How to POST JSON data with Curl from Terminal/Commandline to Test Spring REST?

3

Parece que tiene algunos errores en su archivo de configuración de PHP.

Para corregir sus errores, debe editar su archivo php.ini.

Para mostrar errores en el modo de desarrollo, cambie el valor error_reporting a E_ALL.

error_reporting=E_ALL 

Luego debe habilitar la extensión cURL. Para habilitarlo en su php.ini dude que su tiene que elimine la línea siguiente:

extension=php_curl.dll 

Una vez que modifique este valor, no se olvide de reiniciar el servidor web (Apache o Nginx)

También me de acuerdo con mis colegas, debe url_encode su cadena JSON.

Desde mi punto de vista, el código debe ser:

<?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; 

EDIT:

Otro enfoque podría ser la de utilizar el controlador Oficial de PHP para la API de hecho: Official PHP driver for the Factual API

Proporciona un Debug Mode con un cURL Debug Output y un Exception Debug Output.

+0

Gracias. Había olvidado descomentar 'extension = php_curl.dll'. –

1

Para beneficio futuro:

  1. Uso urlencode de parámetros de consulta como los filtros de parámetro contiene muchos caracteres que no son seguros/válida para las direcciones URL

  2. Use curl_getinfo() para ver información sobre HTTP_CODE y otra información útil.

0

el hecho de que el guión deja de hacer nada en absoluto lo encontrarás aquí:

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

extracto:

La función set_time_limit() y el max_execution_time directiva de configuración única afectar el tiempo de ejecución del script en sí. No se incluye el tiempo dedicado a la actividad que ocurre fuera de la ejecución del script, como las llamadas al sistema utilizando system(), operaciones de flujo de datos, consultas de bases de datos, etc., al determinar el tiempo máximo que el script se ha estado ejecutando. Esto no es cierto en Windows donde el tiempo medido es real.

lo que, básicamente, todos los bloques de enrollamiento el script php y básicamente lo único que está funcionando realmente es rizo, por lo que si se bloquea para siempre, su sitio no responden, por eso es necesario utilizar tiempos de espera ...

cómo evitarlo, solo use tiempos de espera ...

+0

Esto normalmente sería correcto si PHP_CURL no usara CURL en el sistema host esencialmente haciendo un muy elegante 'exec (" curl .... ")' si curl se detiene para la entrada del usuario php simplemente esperará y esperará sin importar cómo siempre que establezca el tiempo de espera para. –

Cuestiones relacionadas