我有一个移动版的PHP网站,并在那里显示谷歌广告。我分别从我的客户端收到了页眉和页脚的谷歌代码,但它们并不总是显示。我在自动错误报告中收到很多警告,如下所示:
fopen(http://pagead2.googlesyndication.com/pagead/ads?...): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
在URL中的问号后面有一些带有私人信息的参数,所以我决定写...而不是它们。我已经要求我的客户重新生成代码,他已经这样做了,我已经粘贴了页眉和页脚的新代码,但是,当我们认为错误消失时,我们决定将它称为一天,16小时后我已收到4352错误报告,其中95%是谷歌广告,错误是相同的,即:无法打开流。我想知道为什么我们有时会看到这些广告以及为什么他们没有在其他情况下出现。问题:当你们有这个错误时,摆脱它们并展示广告的步骤是什么? (当然我可以把广告拿走,但我的客户会不高兴,大声笑)
编辑: 这是代码的一部分(机密信息从中取出并替换为'秘密')。我希望这个问题现在更有意义。
$GLOBALS['google']['client']='secret';
$GLOBALS['google']['https']=read_global('HTTPS');
$GLOBALS['google']['ip']=read_global('REMOTE_ADDR');
$GLOBALS['google']['markup']='xhtml';
$GLOBALS['google']['output']='xhtml';
$GLOBALS['google']['ref']=read_global('HTTP_REFERER');
$GLOBALS['google']['slotname']='secret';
$GLOBALS['google']['url']=read_global('HTTP_HOST') . read_global('REQUEST_URI');
$GLOBALS['google']['useragent']=read_global('HTTP_USER_AGENT');
答案 0 :(得分:1)
由于您提到的错误位于远程服务器上,因此我尝试尽可能多地测试该服务器。
我尝试丢弃我的终端问题,包括我的ISP,浏览器,防火墙和代理。之后,我会尝试测试另一个端点。
首先,尝试在错误日志中查找模式,尝试查找是否发生因为短时间内的许多连接,来自特定位置的请求,旧浏览器,特定版本的浏览器等等。
短时间内的连接数太多
对于Google服务器,这不应该是一个问题,但它可能表示奇怪的情况,某些请求可能无法获得正常或完整的HTTP响应。你无法对此进行真正的测试,但你可以尝试检测并做出反应。
旧浏览器 - 浏览器的特定版本
可能是浏览器发送一个不完整的请求的错误,这恰巧恰好是一个无效的请求,并指向一个不存在的资源。可能是浏览器有缓存缺陷,并且在没有检查资源的情况下发送404响应。您通过使用至少两个不同的浏览器和私有会话来测试这一点,这样您就可以丢弃浏览器问题,缓存和cookie。 (这仅适用于JS)。
请求来自特定位置
该位置可能存在连接问题,或有缺陷的ISP,过度热心的缓存服务或有问题的代理。您无法对此进行测试,但您可以尝试检测它并做出反应,例如,不要向这些请求发送广告。
防火墙 - 代理
您客户的网站名称是否类似于禁止/阻止的网站名称?如果是这样,并且如果在服务器上巧合发生了拼写错误,则每次请求通过时您可能会受到影响。查看被禁网站列表。
客户端服务器上的重载
您的客户的网站是托管在共享主机上,还是托管可能被滥用?如果是这样,可能会发生奇怪的行为,例如与命令的执行时间限制有关,或者因为它建立了太多的连接而有些必须被删除,留下一些连接只是挂起并等待回答。这很难测试,但您可以检查服务器负载,进行反向IP检查以查看是否有许多客户端共享相同的IP,执行cURL请求并检查平均时间。
时间限制 - 重定向
整个连接过程有不同的时间限制。您可以检查是否存在此问题,至少从您的系统用户和客户端的服务器进行检查。使用cURL会话创建一个PHP文件(每次重新连接并重新连接),多次执行,并检查响应时间和重定向。检查您是否始终从服务获得正确的响应,如果它需要太长时间,如果有重定向,如果每次都有重定向或只是一些时间,请测试不同的时间。
编辑(来自LajosÁrpád)广告尺寸不匹配
代码可能适用于给定的大小,而您可能使用不同的大小。您应该尝试从客户那里获取有关该问题的信息。
设置不匹配
这是上述情况的一般情况,但我独立描述了广告尺寸问题,因为广告尺寸不匹配经常发生,而且可能是真正的问题。此外,您应该检查其他重要设置是否匹配,是否存在错误处理问题。
编辑结束
在我看来,这应该会为您提供您正在寻找的答案,如果没有,您可以提供有关此问题的更多详细信息,这些信息对其他人有用或使用结果在Google上提问/报告
答案 1 :(得分:0)
fopen was part of the google code and we are not allowed to modify that, so I have to leave it at that even if it is strange
那是double bind。摆脱它。如果它不起作用,你就无法使它发挥作用。
我发现这个nearly 7 (!) years old post抱怨你的fopen电话没有工作"在他们的结尾"。
答案 2 :(得分:0)
如果fopen有时会对你有用,有时却没有, 您可以在代码中使用条件化操作,如下所示:
<?php
// Turn off all error reporting
error_reporting(0);
$url = 'http://pagead2.googlesyndication.com/pagead/ads'; //put your real url here
$fp = fopen($url, 'r');
// The variable $http_response_header will automagically be generated (array)
/* you may explore the rsponse by un-commenting the following
foreach($http_response_header as $key=>$value){
echo $key.'='.$value.'<br>';
}
*/
$response_code = @explode(' ', $http_response_header[0]);
$response_code = (int)$response_code[1];
if($return_code==200){
// show the ad part
// echo 'OK';
} else {
// whatever
// echo 'OH.BOY';
}
?>
另一种方法是使用javascript AdSense代码。 您的客户可能会将javascript部分包含在页眉/页脚等中。 它通常看起来像:
<script type="text/javascript">
<!-- google_ad_client = "pub-UNIQUE_NUMBER";
/* 300x250, created dd/mm/yy */
google_ad_slot = "11111111";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>