2009-05-02 13 views
12

Prawie każdy pracujący programista PHP musiał używać CURL do wysyłania nieprzetworzonych żądań HTTP, bez względu na to, czy chodzi o przetwarzanie płatności za pomocą karty kredytowej, o skąpy ekran, czy o coś pośredniego.Jakie kroki podejmiesz, aby rozwiązać problemy z PHP cURL?

Prawie każde forum, na którym gromadzą się programiści PHP ma dużą liczbę osób, które są can't get the cURL functions to do what they want.

Kiedy cURL nie działa dla Ciebie, jakich technik rozwiązywania problemów używasz, aby dowiedzieć się, dlaczego to nie działa? Jakie dziwne pomysły z implementacją curl PHP są dostępne? Jeśli ktoś pyta o pytanie "HALP MY CURL IZ BROKEN" na forum, jakie kroki podejmujecie, aby dowiedzieć się, dlaczego ich prośba nie działa?

+0

wystarczy użyć CURLOPT_HEADER dostać nagłówek .. Nie ma potrzeby stosowania tej funkcji –

Odpowiedz

15

Uważam, że bardzo przydatna jest opcja CURLINFO_HEADER_OUT.

<?php 
$curl = curl_init('http://www.php.net'); 

curl_setopt($curl, CURLOPT_HEADERFUNCTION, 'dbg_curl_data'); 
curl_setopt($curl, CURLOPT_WRITEFUNCTION, 'dbg_curl_data'); 
curl_setopt($curl, CURLINFO_HEADER_OUT, true); 

curl_exec($curl); 

echo '<fieldset><legend>request headers</legend> 
    <pre>', htmlspecialchars(curl_getinfo($curl, CURLINFO_HEADER_OUT)), '</pre> 
</fieldset>'; 

echo '<fieldset><legend>response</legend> 
    <pre>', htmlspecialchars(dbg_curl_data(null)), '</pre> 
</fieldset>'; 

function dbg_curl_data($curl, $data=null) { 
    static $buffer = ''; 

    if (is_null($curl)) { 
    $r = $buffer; 
    $buffer = ''; 
    return $r; 
    } 
    else { 
    $buffer .= $data; 
    return strlen($data); 
    } 
}
+0

czy to działa również na dane pocztowe? im błąd "Ostrzeżenie: curl_exec() [function.curl-exec]: Nie można wywołać CURLOPT_WRITEFUNCTION w C: \ xampp \ htdocs \ my_project \ login.php', gdzie na ine 49 jest napisane' $ res = curl_exec ($ curl); ' – diEcho

+0

Tak, działa również z danymi POST. Wygląda na to, że nazwa funkcji, którą przekazałeś do curl_setopt/CURLOPT_WRITEFUNCTION, w rzeczywistości nie działa na funkcję/wywołanie. – VolkerK

+1

Wow, to było bardzo czyste i wydajne rozwiązanie. Naprawdę pomógł mi ton, dzięki! – angularsen

3

Właściwie nigdy nie używam CURL (w php). Api o strumieniu PHP jest o wiele starsze i może być również użyte do danych POST. Wez Furlong ma artykuł na ten temat.

Jeśli miałbym go użyć? Zacznę od włączenia wszystkich wiadomości (ustawianie raportowania błędów na E_ALL). Jeśli okaże się, że PHP nie mówi mi, czego potrzebuję w komunikatach o błędach, prawdopodobnie użyłbym podejścia proxy, aby zobaczyć, co się właściwie dzieje. Zmiana docelowego adresu URL na lokalną stronę php zawierającą coś podobnego do tej, która zawiera coś w rodzaju: Innym sposobem jest użycie narzędzia jak netcata słuchać na porcie 80 i wysłać żądanie tam:

netcat -l -p 80 

To nie będzie nic do zwijania się wrócić, ale będzie można zobaczyć dokładnie to, co jest wysyłane do serwera, co może wystarczyć do zdiagnozowania problemu.

Możesz również pobrać nagłówki z PHP za pomocą funkcji apache_request_headers(). W większości przypadków preferuję podejście netcat, ponieważ gwarantuje to, że widzę niezmienioną prawdę, a także wyświetla dane surowych postów.

+0

To świetny punkt o bibliotece strumienia. Czy funkcje strumieniowe są dostępne, jeśli opakowania narożne url są wyłączone? –

+0

Funkcje strumienia są prawdopodobnie dostępne, ale przykład, do którego dołączyłem, nadal wymaga rzeczywistego połączenia za pomocą fopen(), co oznacza, że ​​nie będzie działać z wyłączonym allow_url_fopen. Jeśli tak, to jesteś skazany na użycie loków. Osobiście zawsze go włączam i unikam popełniania błędów, które od początku sprawiają, że adres url staje się zagadnieniem bezpieczeństwa. :) –

+0

Zdecydowanie podoba mi się strumień api. Na marginesie: php (lub rozszerzenie curl) można skompilować, aby użyć curl jako handler dla niektórych wrapperów url. – VolkerK

Powiązane problemy