Php click2mail molpro api非法字符异常仅在Google应用程序引擎处于生产状态时出现
我的GAE实例(php55)有问题。当我在本地主机上运行GAE时,我的应用程序正在与api进行交互,我的代码工作正常,但当我在生产环境中从GAE运行click2mail时,它抛出了一个错误。他们正在生成一个大堆栈跟踪,跟踪中的根本原因错误是:Php click2mail molpro api非法字符异常仅在Google应用程序引擎处于生产状态时出现,php,xml,google-app-engine,Php,Xml,Google App Engine,我的GAE实例(php55)有问题。当我在本地主机上运行GAE时,我的应用程序正在与api进行交互,我的代码工作正常,但当我在生产环境中从GAE运行click2mail时,它抛出了一个错误。他们正在生成一个大堆栈跟踪,跟踪中的根本原因错误是: WstxUnexpectedCharException: Illegal character ((CTRL-CHAR, code 5)) at [row,col {unknown-source}]: [1,213] 他们的api是基于xml的,所以我生成
WstxUnexpectedCharException: Illegal character ((CTRL-CHAR, code 5))
at [row,col {unknown-source}]: [1,213]
他们的api是基于xml的,所以我生成一个xml字符串(邮件地址)并将其发布到他们的api端点。我已经联系过他们,并向他们提供了我正在上传的xml,他们找不到任何错误,它可以很好地上传给他们
我今天做了一些详尽的测试来解决这个问题
我设置了一个新的Google应用程序引擎实例,这样我就可以将它与我的应用程序的其余部分隔离开来,并尝试获得一个最小的环境。我把一个简单的测试页面放在一起,这样我就可以在localhost和GAE上的googlecloud上并排运行它
当我试图在谷歌的云中上传3000个地址时,我验证了这个错误仍然存在,当我从localhost上传时,这个错误仍然有效
然后,我将数据集分成两部分(1500和1500),并尝试每一部分,看看其中一个是否有效。他们都在本地工作,都在谷歌的云上失败了
我试着把它分成4个(每个750个)。他们都在当地工作。所有这些都在谷歌的云计算中失败了
然后我试着上传一个地址,第一个地址。在本地工作,在谷歌云上失败
然后我再次尝试上传一个地址,但最后一个地址(以防万一)。在本地工作,在谷歌云上失败
我试图找到任何可能与本地主机GAE和生产GAE不同的内容。代码使用simplexmlement
生成xml,我认为生产GAE可能有不同的实现或其他东西(很像ImageMagick在本地主机和生产环境中的工作方式不同),因此我尝试更新代码以手动生成xml,而不是使用simplexmlement
。不幸的是,它在localhost上工作,但在谷歌的云上仍然失败
生产GAE有些不同,正在干扰我的应用程序。在我的代码和click2mail方面,这似乎都不是问题,所以我真的需要你的帮助
下面是我上传的一个xml api示例,其中我只包含一个地址(但为了隐私,我更改了地址):
我已经用尽了我所有的想法。你知道为什么这在本地主机上可以工作,但在GAE上却无法生产吗
<?xml version="1.0"?>
<addressList>
<addressListName>test list one address time 1489112489</addressListName>
<addressMappingId>XXXXXX</addressMappingId>
<addresses>
<address>
<seller_id>XXXXXX</seller_id>
<due_date>2017-03-03</due_date>
<id>110</id>
<num>1</num>
<c_id>34</c_id>
<title>XXXXXX</title>
<first_name>XXXXXX</first_name>
<last_name>XXXXXX</last_name>
<address>XXXXXX XXXXXX Ave</address>
<city>XXXXXX</city>
<state>CA</state>
<zip>XXXXXX</zip>
<o1></o1>
<o2></o2>
<o3></o3>
<mail_address>XXXXXX XXXXXX Ave</mail_address>
<mail_city>XXXXXX</mail_city>
<mail_state>CA</mail_state>
<mail_zip>XXXXXX</mail_zip>
<phone1></phone1>
<manager_id>1</manager_id>
<delivery_type_id>8</delivery_type_id>
<carrier>click2mail</carrier>
<cost>0.4220</cost>
<weight>0.0000</weight>
<offer_exp>Friday, March 24, 2017</offer_exp>
<mailer_tracking>XXXXXX</mailer_tracking>
</address>
</addresses>
</addressList>
$xml = new SimpleXMLElement('<addressList/>');
$xml->addChild('addressListName', $listname);
$xml->addChild('addressMappingId', $mappingid);
$addresses = $xml->addChild('addresses');
foreach($addresslistarray as $row) {
$address = $addresses->addChild('address');
foreach($fieldnames as $field) {
$value = '';
if ($row[$field] != null) {
$value = htmlspecialchars($row[$field]);
}
$address->addChild($field, $value);
}
}
$xmlstring = $xml->asXML();
$url = c2m_endpoint('addressLists'); // just builds the api url
$response = c2m_httppost($url, $xmlstring);
function c2m_httppost($url, $content) {
$client = new GuzzleHttp\Client(['verify'=>'ca-bundle.crt']);
$config = [
'auth' => [c2m_username(), c2m_password()],
'body' => $content,
'headers' => [
'Content-Type' => 'application/xml',
]
];
try {
$response = $client->request('POST', $url, $config);
$result = (string)$response->getBody();
return c2m_xml_to_map($result);
} catch (GuzzleHttp\Exception\ServerException $e) {
error_log("URL: $url");
error_log("REQUEST: ".GuzzleHttp\Psr7\str($e->getRequest())."\n\n");
if ($e->hasResponse()) {
$mesg = "RESPONSE: ".GuzzleHttp\Psr7\str($e->getResponse())."\n\n";
print($mesg);
error_log($mesg);
}
return null;
}
}