PHP 如何正确使用 OTRS GenericTicketConnectorSOAP

how to use properly OTRS GenericTicketConnectorSOAP in PHP

我正在使用 PHP 5.6 版。我制作了一个 PHP 表单,其中包含 3 个字段、用户名、密码和 CSV 文件上传。 CSV 文件的每一行都包含两个“数字代码”,即票号和发票号除以“;” ,所以 CSV 有两列。在我编写的处理代码中,我编写了逐行读取 CSV 文件的代码,并将票号和发票号分解为两个变量。之后,生成需要通过 GenericTicketConnectorSOAP 发送的 XML 数据并执行票证更新的代码。我的 php 代码如下:

$URL = 'http://localhost/otrs/nphgenericinterface.pl/Webservice/GenericTicketConnectorSOAP';
$NameSpace = 'http://www.otrs.org/TicketConnector/';
         // SOAP parameters 
$parameters = [
'proxy_host'     => $URL,
'proxy_port'     => 8080,
'stream_context' => stream_context_create(
array(
'ssl' => array(
'verify_peer'       => false,
'verify_peer_name'  => false,
)
)
)
];
// More code that it is not necessary to post it
//Posting the code that the problem starts
    if(move_uploaded_file($_FILES['file']['tmp_name'],($path . $newfilename))){
echo '<div class="alert alert-primary" role="alert"><p>Success: File uploaded.</p></div>';
                                                     $fn = fopen($path . $newfilename,"r");
  
                                                    while(! feof($fn) )  {
                                                        
                                                    $content = fgets($fn);
                                                    // Divide the ticket number and the invoice number into two variables
                                                    list($ticketnumber,$invoicenumber) = explode(";", $content);
                                                    
                                                    echo "TicketNumber: ".$ticketnumber." Invoicenumber: ".$invoicenumber;
                                                    
                                                
                                                            // Making XMLData 
                                                    
                                                            $XMLData = '<UserLogin>'.$user.'</UserLogin><Password>'.$password.'</Password>';
                                                            $XMLData .= '<TicketNumber>'.$ticketnumber.'</TicketNumber>
                                                            <DynamicField><Name>'.$invoicefield.'</Name>
                                                            <Value>'.$invoicenumber.'</Value></DynamicField>'; 
                                                             // SOAP client
                                                            // extension of php soap NEED TO BE ENABLED ON php.ini
                                                    
                                                            $client = new SoapClient($NameSpace,$parameters);
                                                            $result = $client -> TicketUpdate($XMLData);
                                                                
                                                                if (is_soap_fault($result)) {
                                                                    print_r("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR);
                                                                    $scarti.=",".$ticketnumber;
                                                                    echo '<div class="alert alert-danger" role="alert"><p>Ticket fault: '.$scarti.'</p></div>';
                                                                }else{
                                                                    echo '<div class="alert alert-success" role="alert"> Success ticket number:'.$ticketnumber.'</div>';
                                                                } 


                                                    } // while ends

我的问题出现在 while 循环中,它在 CSV 文件的第一行停止,而没有收到任何 SOAP 客户端或 SOAP 函数调用的错误消息。这里可能出了什么问题?如果我删除“SOAP 代码”,循环会在最新的票号处停止,所以这一定是 SOAP 客户端或函数上的错误。另外,我用这段代码测试了 SOAP 连接:

         $handle = curl_init($URL);
                                  curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
                                  $response = curl_exec($handle);
                                  $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
                                  if($httpCode == 404) {
                                       echo "Connection failed";
                                  }else {
                                        echo "Connection OK";
                                  }  

结果是“连接正常”。

更新:

我写这段代码是为了打印任何错误:

    $parameters = [
    'stream_context' => stream_context_create(
    array(
    'ssl' => array(
    'verify_peer => false,
 'verify_peer_name'  => false,
    )
)
)
try{
                                                                   
$client = new SoapClient($URL,$parameters); 
                                    
}catch(Exception $e){
    echo $e->getMessage();
}   

结果是:“SOAP-ERROR:解析 WSDL:无法从 'http://localhost/otrs/nph-genericinterface.pl/Webservice/GenericTicketConnectorSOAP' 加载:无法加载外部实体“http://localhost/otrs/nph-genericinterface。pl/Webservice/GenericTicketConnectorSOAP”。 =14=]

问题已通过在 php.ini 文件中添加以下行得到解决:

ini_set('soap.wsdl_cache_enabled', '0'); 
ini_set('soap.wsdl_cache_ttl', '0');