来自Cpanel Live Server ,我在PHP中编写了 API 来获取所有产品和相关内容。
在4999种产品中,只有894种产品节省了1.7秒。共有15张相关数据表正在倾倒到数据库中。
1.7秒后,我正在
噢,Snap!在Chrome中显示此网页时出现了一些问题
我认为用php清除浏览器缓存。
所以我尝试从下面描述的以下方式从客户端重置:
上述方法无效
从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);
由于上述原因,我无法找到正确的解决方案?可能是出现此类错误的原因是什么?
答案 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大小的依赖性。