2013-11-26 3 views
2

Я пытаюсь использовать класс HttpRequest, который должен быть в расширении php PECL_HTTP. У меня есть php5 и для установки pecl_http используется следующее.PECL_HTTP не распознан php ubuntu

sudo pecl install pecl_http 

pecl/pecl_http is already installed and is the same as the released version 2.0.1 
install failed 

После этого я войти в мое php.ini:

[PHP] 
extension=http.so 
[...] 

Затем я перезагрузить apache2 сервер и попробуйте использовать класс HttpRequest, но это дает мне следующую ошибку:

PHP Fatal error: Class 'HttpRequest' not found 

Какая ошибка может произойти, возможно, я пропустил?

UPDATE: (Изменено название)

Расширение не отображается в phpinfo(), я установил

extension=http.so 

И проверил, если файл http.so в моем extension_dir. Я действительно не знаю, как заставить php распознавать расширение.

UPDATE 2: Мне удалось установить расширение, но класс все еще не существует. Для других я должен был ссылаться на другие расширения pecl_http. (Для меня: propro.so, raphfr.so)

UPDATE 3: мне не удалось сделать класс видимым, ответы ниже показывают некоторые подходы с другими классами.

Я решил эту проблему, используя CURL.

+1

Поддерживает ли 'phpinfo()' модуль как включен? – Phil

+0

Нет, это не так. И я действительно не знаю, почему. См. Обновление – Iwan1993

+0

Вы обновили правильный файл php.ini? – Phix

ответ

4

Вы установили новую версию расширения, которая использует совершенно другой API. Я до сих пор не знаю, как это работает, но я уточню свой ответ, который я знаю. Документацию новой версии можно найти по адресу http://devel-m6w6.rhcloud.com/mdref/http.

установить старую версию, сначала удалите новую Verion, а затем выполнить

pecl install http://pecl.php.net/get/pecl_http-1.7.6.tgz 

UPDATE: вот два примера из документации, и должны хорошо работать:

один запрос (можно найти на http://devel-m6w6.rhcloud.com/mdref/http/Client/enqueue):

<?php 
(new http\Client)->enqueue(new http\Client\Request("GET", "http://php.net"), 
    function(http\Client\Response $res) { 
     printf("%s returned %d\n", $res->getTransferInfo("effective_url"), $res->getResponseCode()); 
     return true; // dequeue 
})->send(); 

нескольких запросов (можно найти по адресу http://devel-m6w6.rhcloud.com/mdref/http/Client/once):

<?php 
$client = new http\Client; 
$client->enqueue(new http\Client\Request("HEAD", "http://php.net")); 
$client->enqueue(new http\Client\Request("HEAD", "http://pecl.php.net")); 
$client->enqueue(new http\Client\Request("HEAD", "http://pear.php.net")); 

printf("Transfers ongoing"); 
while ($client->once()) { 
    // do something else here while the network transfers are busy 
    printf("."); 
    // and then call http\Client::wait() to wait for new input 
    $client->wait(); 
} 
printf("\n"); 

while ($res = $client->getResponse()) { 
    printf("%s returned %d\n", $res->getTransferInfo("effective_url"), 
     $res->getResponseCode()); 
} 

В обоих примерах вы можете использовать $res->getBody(), чтобы вернуть тело ответа.

Я не мог проверить эти примеры, но я слышал о других людях, что они работают.

1

У меня была такая же проблема, и решить ее путем организовать порядок в расширениях которым загружаются в php.ini

Все мои другие расширения был загружен, используя свои собственные файлы .ini в /etc/php5/mods_available. В моем apache2 error.log Я заметил, что json_decode был необходим http.so для загрузки.

Я создал файл для http (http.ini) и символическую ссылку в /etc/php5/apache/conf.d с более высоким префиксом, чем json.

мой http.ini


; configuration for php http module 
; priority=50 

extension=raphf.so 

extension=propro.so 

extension=http.so 

использовать новый pecl_http.2.0.6 как этот

new http\Message(); 

или расширить в своем собственном классе, как распространяется HTTP \ Message

Смежные вопросы