噢,抢!展示此网页时出现了一些问题

时间:2018-03-27 10:20:09

标签: php google-chrome http-headers google-chrome-devtools

来自Cpanel Live Server ,我在PHP中编写了 API 来获取所有产品和相关内容。
在4999种产品中,只有894种产品节省了1.7秒。共有15张相关数据表正在倾倒到数据库中。

1.7秒后,我正在

  

噢,Snap!在Chrome中显示此网页时出现了一些问题

我认为用php清除浏览器缓存。

所以我尝试从下面描述的以下方式从客户端重置:

  1. 未选中可用时使用硬件加速
  2. 硬刷新或重新加载 Ctrl + F5 通过绕过本地缓存重新加载网站无法解决问题
  3. 清除Chrome浏览Cookie数据和缓存
  4. 删除了所有Chrome扩展程序
  5. 试图通过以下命令启动浏览器:/ usr / bin / google-chrome-stable%U --ignore-certificat --allow-no-sandbox-job --disable-gpu --ssl-version-min = tls1 --disable-print-previewe-errors
  6. 清除“缓存的图像和文件”
  7. 上述方法无效

    从Chrome DevTools进行检查

    常规

    Request URL: https://www.SomeDomain.in/index.php?route=api/synchronization/checkapikey
    Request Method: POST
    Status Code: 200 OK
    Remote Address: 56.212.130.100:443
    Referrer Policy: no-referrer-when-downgrade
    

    响应标题

    Access-Control-Allow-Credentials: true
    Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With
    Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS
    Access-Control-Allow-Origin: https://www.SomeOtherDomain.com
    Access-Control-Max-Age: 1000
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Connection: Keep-Alive
    Content-Type: application/json
    Date: Tue, 27 Mar 2018 09:20:03 GMT
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Keep-Alive: timeout=2, max=500
    Pragma: no-cache
    Server: Apache
    Set-Cookie: currency=INR; expires=Thu, 26-Apr-2018 09:20:03 GMT; Max-Age=2592000; path=/; domain=www.SomeDomain.in
    Set-Cookie: language=en-gb; expires=Thu, 26-Apr-2018 09:20:03 GMT; Max-Age=2592000; path=/; domain=www.SomeDomain.in
    Set-Cookie: PHPSESSID=73eiaild74dllqv2qu29acl964; path=/; HttpOnly
    Set-Cookie: default=8cipi68v54vf2l6mot7tofi923; path=/; httponly
    Transfer-Encoding: chunked
    

    请求标题

    Accept: */ *
    Accept-Encoding: gzip, deflate, br
    Accept-Language: en,en-GB;q=0.9,en-US;q=0.8
    AlexaToolbar-ALX_NS_PH: AlexaToolbar/alx-4.0.1
    Connection: keep-alive
    Content-Length: 24
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    DNT: 1
    Host: www.SomeDomain.in
    Origin: https://www.SomeOtherDomain.com
    Referer: https://www.SomeOtherDomain.com/admin/index.php?route=account/apisync&token=9Yzmh4XTEjFB4p2Jk5jaMJOlm78Z9nzt
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
    

    在控制器中添加以下PHP代码

    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Expires: 0");
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    header("Content-Type: application/xml; charset=utf-8");
    

    但有一件事是缓存的图像和文件:120 MB。 添加上面的代码后,它在结果的末尾设置为2.5 MB

    <小时/> 响应标题的结果:

    Cache-Control: no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0
    Connection: Keep-Alive
    Content-Encoding: gzip
    Content-Type: application/xml; charset=utf-8
    Date: Tue, 27 Mar 2018 09:21:31 GMT
    Expires: 0
    Keep-Alive: timeout=2, max=500
    Last-Modified: Tue, 27 Mar 2018 09:21:54 GMT
    Pragma: no-cache
    Server: Apache
    Set-Cookie: default=ip18higdsc0v55ncmn98f0k346; path=/; httponly
    Transfer-Encoding: chunked
    Vary: Accept-Encoding
    

    我还使用了CURL功能轻松实现:

    $headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';              
    $headers[] = 'Connection: Keep-Alive';         
    $headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';         
    $user_agent = 'php';         
    $process = curl_init();         
    curl_setopt($process, CURLOPT_HTTPHEADER, $headers);         
    curl_setopt($process, CURLOPT_HEADER, 0);         
    curl_setopt($process, CURLOPT_USERAGENT, $user_agent);    
    curl_setopt($process, CURLOPT_TIMEOUT, 30);         
    curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);         
    curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);         
    $return = curl_exec($process);         
    curl_close($process); 
    

    由于上述原因,我无法找到正确的解决方案?可能是出现此类错误的原因是什么?

1 个答案:

答案 0 :(得分:1)

最后通过26.1分钟上传所有4999个产品,请求传输大小为20.1 MB,以及所有相关的15个表,解决了问题。如果没有配置Chrome设置,请将其保留为默认设置。

因为需要26.1分钟,因为需要从服务器检索超过25,000张图像,并且带宽有限。

另外,请确保您的RAM大小应大于4GB

通过向CURL和PHP添加一些配置:

在CURL中,

curl_setopt($process, CURLOPT_TIMEOUT, 1800); #Drop connection after 60*30 seconds

# This is inadvisable in a production environment. If the CONNECTTIMEOUT set to Zero
curl_setopt($process, CURLOPT_CONNECTTIMEOUT, 0); # CURLOPT_CONNECTTIMEOUT <= CURLOPT_TIMEOUT in seconds

在PHP中,您必须再次删除时间限制或PHP本身(默认情况下30秒后)将沿着Curl的请求终止脚本。 仅此一项就可以解决您的问题 此外,如果您需要数据完整性,可以使用ignore_user_abort

添加一层安全性
# The maximum execution time, in seconds. If set to zero, no time limit is imposed.
set_time_limit(0);

# Make sure to keep alive the script when a client disconnect.
ignore_user_abort(true);

客户端断开连接将中断脚本的执行并可能损坏数据,
例如。非过渡数据库查询,构建配置文件,ecc。,在你的情况下,它会下载一个部分文件......你可能或不关心这个。

此外,您可以自由尝试这样做,

ob_start(); // start output buffer
ob_end_clean(); // discard output buffer

提高绩效:
您可以在后台缓存API输出或进行API调用。为API请求建立合理的超时,如果可能,准备在没有API响应的情况下显示输出。 反过来,这会将头脑置于客户的浏览器

curl_setopt($curl1, CURLOPT_FRESH_CONNECT, 1); // don't use a cached version of the url 

CURLOPT_FRESH_CONNECT TRUE to force use of a new connection instead of a cached one.

你可以设置标题

$headers = array( 
                 "Cache-Control: no-cache", 
                ); 
curl_setopt($curl1, CURLOPT_HTTPHEADER, $headers);

在PHP中,

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);

更新

当500内部服务器错误遇到a.k.a.,白色死亡屏幕

原因:在处理权限设置为777的任何文件或文件夹时,PHP会运行500错误

<强>解决方案: PHP文件必须具有设置为644的权限。 任何包含PHP文件和PHP访问权限的文件夹(例如,上传文件,mkdir cmds)都必须将权限设置为755.

如果上述解决方案不起作用,请尝试设置

error_reporting(E_ALL);
ini_set('display_errors', 'On');
error_reporting(-1); // reports all errors
ini_set("display_errors", "1"); // shows all errors
ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");

始终将JSON编码数据检索到控制器并且它是高度安全的,而不是从视图中检索然后传入控制器,该控制器取决于调用函数的放置位置。 仅这一点就可以消除RAM大小的依赖性。