2014-09-30 4 views
4

У меня есть PHP-скрипт, который использует SoapClient для доступа к API. После подключения, если я просто сделаю один запрос, он работает как ожидалось, но когда я пытаюсь сделать второй запрос с тем же объектом SoapClient, я получаю ошибку Bad Request.PHP SoapClient завершается с ошибкой после одного запроса

Я считаю, что проблема может быть связана с моей конфигурацией сервера, потому что тот же PHP-код отлично работает на другом компьютере с более старой версией PHP, но на моих тестовых и производственных серверах, которые были обновлены до PHP 5.6, оба испытывают эту ошибку ,

Код:

<?php 

class ReportAPI 
{ 
    protected $reportDataObject = null; 

    public function __construct($url = 'URL', $username = 'username', $password = 'pass') { 
    $this->client = new SoapClient($url , array('login' => $username, 'password' => $password, 'keep_alive' => true)); 
    } 
    public function getReportData($reportID) { 
    return $this->getDataObject($reportID)->data; 
    } 
    public function getReportCount($reportID) { 
    return $this->getDataObject($reportID)->result_count; 
    } 
    public function runReport($reportID) { 
    $newID = $this->client->runReport($reportID); 
    $counter = 0; 
    while($this->client->checkReportRun($newID) != 'complete'){ 
     if($counter > 2) { 
     throw new Exception('Report Time Out'); 
     } 
     sleep(5); 
     $counter++; 
    } 
    $this->getDataObject($newID); 
    return $newID; 
    } 

    public function functest() { 
    $v0 = $this->getDataObject('id')->result_count; 
    return $this->getDataObject('id')->data; 
    } 

    public function getLatestID($reportID) { 
    $runlist = $this->client->getReportRunList($reportID); 
    return $runlist[0][0]; 
    } 

    public function getLatestReportData($reportID) { 
    return $this->getReportData($this->getLatestID($reportID)); 
    } 

    public function getTitles($reportID) { 
    return $this->getDataObject($reportID)->columns; 
    } 

    public function getReportRunTime($reportID) { 
    $runlist = $this->client->getReportRunList($reportID); 
    return strtotime($runlist[0][2]); 
    } 

    public function getRawReport($reportID) { 
    return $this->client->getReportDataObject($reportID); 
    } 

    protected function getDataObject($reportID) { 
    if(!isset($this->reportDataObject) || $this->reportDataObject->report_run_id != $reportID) { 
     $this->reportDataObject = $this->client->getReportDataObject($reportID); 
    } 
    return $this->reportDataObject; 
    } 
} 

?> 
+0

В качестве подумав, я попытался добавить keep_alive опцию к SoapClient, но это не помогло. – latca

+0

Как выглядит ваш код? –

+0

@ Mr.Concolato: Я отредактировал сообщение и добавил его. Благодаря! – latca

ответ

2

Эта проблема была исправлена ​​в PHP 5.6.1. Хотя я не мог найти ссылку на эту проблему в журналах изменений, после установки 5.6.1 я могу повторно использовать объект SoapClient и выполнять последующие вызовы __doRequest().

PHP Download Link

+0

Отлично! Я проверю это. Я закончил тем, что вернулся к предыдущей версии 5.4, но я проведу последнее обновление. Благодарю. – latca

+0

@latca, если это не поможет, дайте мне HTTP запрос и ответ в XML: 'попробовать { ... } поймать (\ Behat \ Behat \ Exception \ Exception) { var_dump (массив ( 'запрос' => $ client -> __ getLastRequest(), 'requestHeaders' => $ client -> __ getLastRequestHeaders(), 'response' => $ client -> __ getLastResponse(), 'responseHeaders' => $ client -> __ getLastResponseHeaders () )); } ' –

+1

Ошибка, о которой идет речь, вероятно: https://bugs.php.net/bug.php?id=67955 - она ​​указана в списке изменений http://php.net/ChangeLog-5.php#5.6 .1 под SOAP – hakre

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