• 关于

    php_循环

    的搜索结果

回答

array_multisort() 是正确的函数,您必须以某种方式搞砸了: // Obtain a list of columns foreach ($data as $key => $row) { $return_fare[$key] = $row['return_fare']; $one_way_fare[$key] = $row['one_way_fare']; } // Sort the data with volume descending, edition ascending array_multisort($return_fare, SORT_ASC, $one_way_fare, SORT_ASC, $data); 如果您查看的PHP手册页array_multisort(),则可以在此注释中找到一个非常有用的array_orderby()函数,该函数可将上述内容简化为: $sorted = array_orderby($data, 'return_fare', SORT_ASC, 'one_way_fare', SORT_ASC); 为了避免循环使用array_column()(从PHP 5.5.0开始): array_multisort(array_column($data, 'return_fare'), SORT_ASC, array_column($data, 'one_way_fare'), SORT_ASC, $data);
保持可爱mmm 2020-02-09 11:30:43 0 浏览量 回答数 0

问题

为什么ob_flush(),flush()无法正常工作?

已查找php手册,但没有找到问题的原因。具体如下。代码一:能正常工作的代码<?php set_time_limit(0); ob_start(); $i = 1; while (true) { echo str_pad('...
落地花开啦 2019-12-01 20:05:02 861 浏览量 回答数 1

问题

php脚本是否默认有运行时长限制?

我用php脚本循环获取一些数据,本地测试的时候耗时不到20分钟,可以正确获取数据,可是部署到共享虚拟主机基础版的时候,算上每次循环之前都设置set_limit_time(300)和in...
walkline.wang 2019-12-01 22:04:00 2065 浏览量 回答数 1

问题

死板循环输出数组用得不爽,有没有更好的输出方法?

比如我要输出分类表的数据,原来是这样死板的输出数组 <?php //读取主类型。 $sql_0="select * from category where category_parent_id = 0 " ; $query_0=mys...
小旋风柴进 2019-12-01 20:12:09 898 浏览量 回答数 1

问题

求助一段代码的执行结果输出代码编写

下面是一段php代码,主要功能是操作数据库,但是是根据$new_data数组(数组1)进行数据库操作,所以每次都会进行多次数据库操作下面是$new_data数组(数组1)文件内容。需要完成的结果是程序循环执行完成后能判断那一处操作数据库失败...
落地花开啦 2019-12-01 20:04:59 1130 浏览量 回答数 1

问题

php自定义框架类文件载入的疑问,报错

学习视频写了一个php的框架,有一个问题一直不是很清楚,想咨询一下. app(应用)类中: //定义了一个自动载入类函数 spl_autoload_register(array(__CLASS__,'auto')); ...
一枚小鲜肉帅哥 2020-06-20 21:14:48 0 浏览量 回答数 1

回答

那就包装下,这样主程序就看不到while循环了。 <?php $sql_0="select * from category where category_parent_id = 0"; lt($sql_0, function($arr) { ... return $arr; }); ?> function lt($sql, $factor) { $query_0=mysql_query($sql); while ($rs_0 = factor(mysql_fetch_array($query_0))) }
蛮大人123 2019-12-02 02:25:37 0 浏览量 回答数 0

回答

那就包装下,这样主程序就看不到while循环了。 <?php $sql_0="select * from category where category_parent_id = 0"; lt($sql_0, function($arr) { ... return $arr; }); ?> function lt($sql, $factor) { $query_0=mysql_query($sql); while ($rs_0 = factor(mysql_fetch_array($query_0))) }
小旋风柴进 2019-12-02 02:02:31 0 浏览量 回答数 0

问题

为什么php这样写会死循环

$sql="select * from user"; $res=mysql_query($sql); $row=mysql_fetch_row($res); while($row) { echo 'A row'; } 以上代码会死循环而下面...
小旋风柴进 2019-12-01 20:08:17 1130 浏览量 回答数 1

问题

nginx在访问量稍大的情况下,出现503 Service Temporarily Unavaila

当前环境是LNMP(云环境是SLB+ECS+Ploardb),使用jmeter测试时,300的并发,循环5次,当中有20%的请求会出现503...
1886233033041026 2020-04-01 10:07:56 19 浏览量 回答数 1

回答

我将nginx.conf设置爲:  fastcgi_connect_timeout 300s;  fastcgi_send_timeout 300s;  fastcgi_read_timeout 300s;  fastcgi_buffer_size 128k;  fastcgi_buffers 8 128k;#8 128  fastcgi_busy_buffers_size 256k;  fastcgi_temp_file_write_size 256k;  fastcgi_intercept_errors on;  这里最主要的设置是前三条,即  fastcgi_connect_timeout 300s;  fastcgi_send_timeout 300s;  fastcgi_read_timeout 300s;  这里规定了PHP-CGI的连接、发送和读取的时间,300秒足够用了,因此我的服务器很少出现504 Gateway Time-out这个错误。最关键的是php-fpm.conf的设置,这个会直接导致502 Bad Gateway和504 Gateway Time-out。  下面我们来仔细分析一下php-fpm.conf几个重要的参数:  php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout”  我的两个设置的值一个是”40″,一个是”900″,但是这个值不是通用的,而是需要自己计算的。  计算的方式如下:  如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那麽就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。  而”max_children”这个值又是怎麽计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那麽php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。
我的中国 2019-12-02 01:33:31 0 浏览量 回答数 0

回答

MySQL客户端不允许您执行新的查询,在该查询中仍需要从正在进行的查询中获取行。有关常见错误,请参见MySQL文档中的命令不同步。 您可以用来mysqli_store_result()从外部查询中预提取所有行。这会将它们缓冲在MySQL客户端中,因此从服务器的角度来看,您的应用已获取了完整的结果集。然后,即使在从现在缓冲的外部结果集中提取行的循环中,您也可以执行更多查询。 或者,您mysqli_result::fetch_all()将完整的结果集作为PHP数组返回,然后可以在该数组上循环。 调用存储过程是一种特殊情况,因为存储过程有可能返回多个结果集,每个结果集可能都有自己的行集。这就是为什么@ a1ex07的答案提到使用mysqli_multi_query()和循环直到mysqli_next_result()没有更多结果集。即使您的存储过程只有一个结果集,这也必须满足MySQL协议。 PS:顺便说一句,我看到您正在执行嵌套查询,因为您有代表层次结构的数据。您可能要考虑以不同的方式存储数据,以便可以更轻松地查询它。我做了一个名为“ SQL和PHP的分层数据模型”的演讲。我还在《SQL反模式:避免数据库编程的陷阱》一章中介绍了该主题。 这是mysqli_next_result()在CodeIgnitor 3.0.3中实现的方法: 在system/database/drivers/mysqli/mysqli_driver.php变化的第262行 protected function _execute($sql) { return $this->conn_id->query($this->_prep_query($sql)); } 对此 protected function _execute($sql) { $results = $this->conn_id->query($this->_prep_query($sql)); @mysqli_next_result($this->conn_id); // Fix 'command out of sync' error return $results; } 从2.x开始,这一直是一个问题。我刚刚更新到3.x,并且不得不将此破解复制到新版本中。来源:stack overflow
保持可爱mmm 2020-05-11 12:00:22 0 浏览量 回答数 0

问题

请教关于php中execl导出,循环时间的问题

做php导出,需要循环输出数据到execl中,一开始写了一个,觉得时间有点长,就缩短了下,发现时间还变多了,求教这是为什么啊?谢谢了先。原先的代码片段://归总每个一级分类下的二级分类 foreach($first_cate_array a...
落地花开啦 2019-12-01 20:01:54 842 浏览量 回答数 1

问题

nginx下502和504错误的解决办法

我在司 中电云集  查看并处理阿里云客户工单的问题过程 nginx 502问题比较常见 以下是总结的办法 敬请参考 一、错误提示说明: Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执...
chinaccnet 2019-12-01 21:27:51 16909 浏览量 回答数 6

问题

while嵌套while循环,里面的while为什么只循环一次:报错

目前正在自学PHP中,想写一个留言本,带有留言和回复留言的功能。下面是其中的代码,第20行var_dump打印出来的结果再也面上只有一个,就是第一个,也就是说里面的whi...
kun坤 2020-06-06 23:25:05 0 浏览量 回答数 1

问题

PHP POST表单失败,目标页无法接收,怎么办?

我想通过这个代码实现试卷试题的生成,通过循环生成了单选题目,并想通过数组POST给验证页面进行评分,但是我发现无法获取check[]数组,也无法POST到目标页面。作为新手,目的是想实现功能,因此代码很冗杂- -quesid[$i]数组可以...
小旋风柴进 2019-12-01 20:09:38 1231 浏览量 回答数 1

问题

vue 循环输出数据出错

&lt;ul id="example-1"&gt; &lt;li v-for="item in items"&gt; {{ item.shop_name }} &lt;/li&gt; &lt;/ul&gt; ...
杨冬芳 2019-12-01 20:09:43 1912 浏览量 回答数 2

回答

简短的答案是,如果“第二维”可能在任何地方,您都必须至少隐式​​循环才能做到。如果必须在第一项中,则只需执行 is_array($arr[0]); 但是,我能找到的最有效的通用方法是在数组上使用一个foreach循环,每当找到一个命中点时就会短路(至少隐式循环比直接的for()更好): $ more multi.php 'a',2 => 'b',3 => array(1,2,3)); $b = array(1 => 'a',2 => 'b'); $c = array(1 => 'a',2 => 'b','foo' => array(1,array(2))); function is_multi($a) { $rv = array_filter($a,'is_array'); if(count($rv)>0) return true; return false; } function is_multi2($a) { foreach ($a as $v) { if (is_array($v)) return true; } return false; } function is_multi3($a) { $c = count($a); for ($i=0;$i<$c;$i++) { if (is_array($a[$i])) return true; } return false; } $iters = 500000; $time = microtime(true); for ($i = 0; $i < $iters; $i++) { is_multi($a); is_multi($b); is_multi($c); } $end = microtime(true); echo "is_multi took ".($end-$time)." seconds in $iters times\n"; $time = microtime(true); for ($i = 0; $i < $iters; $i++) { is_multi2($a); is_multi2($b); is_multi2($c); } $end = microtime(true); echo "is_multi2 took ".($end-$time)." seconds in $iters times\n"; $time = microtime(true); for ($i = 0; $i < $iters; $i++) { is_multi3($a); is_multi3($b); is_multi3($c); } $end = microtime(true); echo "is_multi3 took ".($end-$time)." seconds in $iters times\n"; ?> $ php multi.php is_multi took 7.53565130424 seconds in 500000 times is_multi2 took 4.56964588165 seconds in 500000 times is_multi3 took 9.01706600189 seconds in 500000 times 隐式循环,但是一旦找到匹配项我们就无法短路... $ more multi.php 'a',2 => 'b',3 => array(1,2,3)); $b = array(1 => 'a',2 => 'b'); function is_multi($a) { $rv = array_filter($a,'is_array'); if(count($rv)>0) return true; return false; } var_dump(is_multi($a)); var_dump(is_multi($b)); ?> $ php multi.php bool(true) bool(false)
保持可爱mmm 2020-02-07 01:12:24 0 浏览量 回答数 0

回答

提交的某字段,一定是_POST、_GET甚至_REQUEST,而不是单纯讨论$var。要防三个情况:1.提交中根本没有这个字段(如果不处理,下标不存在将直接引发运行时错误)2.提交的字段为空3.提交的字段trim()之后为空如果是原生的PHP,我推荐的步骤如下:1.原则是先预处理$_POST。2.把$_POST中所有元素的首尾空格剥了。3.把$_POST中的所有空元素扔了。4.这样,数组中幸存的元素,就都不是空的。判断元素是否存在即可。注意第二和第三步,千万不要傻傻的用foreach自己循环,最好是使用数组函数里的几个遍历函数。代码:$_POST = array_map('trim', $_POST); $_POST = array_filter($_POST); $result = array_key_exists('fieldname', $_POST); if ($result) { // do whatever you wish }这样足够简便了,不过带来的问题是可移植性差(因为需要依赖前边做过的预处理)。如果想要可移植性又好,看着又简单,判断又全面的,自己写函数去吧。
落地花开啦 2019-12-02 02:49:14 0 浏览量 回答数 0

问题

PHP-在foreach循环中修改当前对象

我想知道是否可以编辑foreach循环中正在处理的当前对象 我正在处理一系列对象$questions,我想遍历数据库中查找与该问题对象相关的答案。因此,对于每一个问题去获取答案对象,并更新当前$q...
保持可爱mmm 2020-02-08 10:57:05 0 浏览量 回答数 1

问题

php语法的问题,实现两个关联数组的key值得比较

在下原来是做c++的,最近公司需要,做了一个php的web网站程序,用的php+mysql+jQuery+css。现在我需要实现一个功能就是在一篇文章的最后显示与这片文章标题类似的文章的推荐,并附带链接。我现在怀疑是不是语法的问题造成的,请...
小旋风柴进 2019-12-01 20:09:20 1626 浏览量 回答数 1

回答

在派生表(子句内的子查询FROM)中,我们对数据user_id进行排序,以使所有具有相同值的行放在一起,并根据game_detail降序对它们进行进一步排序。 现在,我们使用此结果集并使用条件CASE..WHEN表达式来评估行编号。就像循环技术(我们在应用程序代码中使用的,例如:PHP)一样。我们将前一行的值存储在用户定义的变量中,然后对照前一行检查当前行的值。最终,我们将相应地分配行号。 编辑:基于MySQL 文档和@Gordon Linoff的观察: 涉及用户变量的表达式的求值顺序不确定。例如,不能保证SELECT @a,@a:= @ a + 1首先评估@a,然后执行分配。 我们将需要评估行号,并将user_id值分配给@u同一表达式中的变量。 SET @r := 0, @u := 0; SELECT @r := CASE WHEN @u = dt.user_id THEN @r + 1 WHEN @u := dt.user_id /* Notice := instead of = */ THEN 1 END AS user_game_rank, dt.user_id, dt.game_detail, dt.game_id FROM ( SELECT user_id, game_id, game_detail FROM game_logs ORDER BY user_id, game_detail DESC ) AS dt 结果 user_game_rankuser_idgame_detailgame_id162601126100101712001027500113726012475013 在数据库小提琴上查看 我最近发现了MySQL Docs的一个有趣的注释: MySQL的早期版本使得可以在SET以外的语句中为用户变量分配值。MySQL 8.0支持此功能以实现向后兼容,但是在将来的MySQL版本中可能会删除该功能。 另外,由于有一个SO成员,MySQL团队访问了此博客:https : //mysqlserverteam.com/row-numbering-ranking-how-to-use-less-user-variables-in-mysql-queries/ 通常的观察是,ORDER BY在同一查询块中与用户变量的评估一起使用时,并不能确保值始终正确。至于,MySQL优化可以接触到的地方,并改变我们的假设计算顺序。 解决此问题的最佳方法是升级到MySQL 8+并使用以下Row_Number()功能: 模式(MySQL v8.0) SELECT user_id, game_id, game_detail, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY game_detail DESC) AS user_game_rank FROM game_logs ORDER BY user_id, user_game_rank; 结果 user_idgame_idgame_detailuser_game_rank611260161010027101200171150027122603713504来源:stack overflow
保持可爱mmm 2020-05-17 12:44:42 0 浏览量 回答数 0

回答

在派生表(子句内的子查询FROM)中,我们对数据user_id进行排序,以使所有具有相同值的行放在一起,并根据game_detail降序对它们进行进一步排序。 现在,我们使用此结果集并使用条件CASE..WHEN表达式来评估行编号。就像循环技术(我们在应用程序代码中使用的,例如:PHP)一样。我们将前一行的值存储在用户定义的变量中,然后对照前一行检查当前行的值。最终,我们将相应地分配行号。 编辑:基于MySQL 文档和@Gordon Linoff的观察: 涉及用户变量的表达式的求值顺序不确定。例如,不能保证SELECT @a,@a:= @ a + 1首先评估@a,然后执行分配。 我们将需要评估行号,并将user_id值分配给@u同一表达式中的变量。 SET @r := 0, @u := 0; SELECT @r := CASE WHEN @u = dt.user_id THEN @r + 1 WHEN @u := dt.user_id /* Notice := instead of = */ THEN 1 END AS user_game_rank, dt.user_id, dt.game_detail, dt.game_id FROM ( SELECT user_id, game_id, game_detail FROM game_logs ORDER BY user_id, game_detail DESC ) AS dt 结果 user_game_rankuser_idgame_detailgame_id162601126100101712001027500113726012475013 在数据库小提琴上查看 我最近发现了MySQL Docs的一个有趣的注释: MySQL的早期版本使得可以在SET以外的语句中为用户变量分配值。MySQL 8.0支持此功能以实现向后兼容,但是在将来的MySQL版本中可能会删除该功能。 另外,由于有一个SO成员,MySQL团队访问了此博客:https : //mysqlserverteam.com/row-numbering-ranking-how-to-use-less-user-variables-in-mysql-queries/ 通常的观察是,ORDER BY在同一查询块中与用户变量的评估一起使用时,并不能确保值始终正确。至于,MySQL优化可以接触到的地方,并改变我们的假设计算顺序。 解决此问题的最佳方法是升级到MySQL 8+并使用以下Row_Number()功能: 模式(MySQL v8.0) SELECT user_id, game_id, game_detail, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY game_detail DESC) AS user_game_rank FROM game_logs ORDER BY user_id, user_game_rank; 结果 user_idgame_idgame_detailuser_game_rank611260161010027101200171150027122603713504来源:stack overflow
保持可爱mmm 2020-05-17 20:18:32 0 浏览量 回答数 0

问题

shell引入配置文件,并循环过滤存在配置文件中的每一项

`` 导出SVN差异列表 svn log -r $rev1:$rev2 -v \|egrep '^r[0-9]+ |^s+A |^s+M |^s+D ' \|awk '{ if($0 ~ /^r/) {rev = $1;} else { i...
a123456678 2019-12-01 19:59:49 1029 浏览量 回答数 1

回答

先确定数据是否正确了~######$db_array是查询留言的结果,$db_huifu_array是查询回复的结果。sql语句在phpMyAdmin上测试过没问题。第一个while能够读完$db_array,但是第二个while就只能读$db_huifu_array的第一条数据。这个嵌套循环不是这样写?######$liuyan_result 查询在哪? ######感谢回复。 $liuyan_result = mysql_query($liuyan_sql,$conn); 是查询reply回复表的内容。查询的sql在数据库中测试过,应该没问题的。就是不知道if外部的while为啥不能读完$db_huifu_array呢?###### 还用问吗? if($db_array['id'] ==$db_huifu_array['reid']) 肯定只有一次成立. 内部while加log不就知道了? 多加log, 查看while, if的条件. ######不懂php######if外部的while为啥不能读完$db_huifu_array呢?查询的sql在数据库测试过了,没错啊######面条混合式代码,看着累######回复 @songoex : 估摸着你还没学MVC,学了就晓得了######怎么避免这种代码呢?######混合着用,还在学习,请多包涵###### 可以在第二个while里面print_r($db_huifu_array); 看看是不是if没进入. ######在第二个while里面第一行打印$db_huifu_array后,页面上只有第一条留言有输出,其它的都没有。按照道理来说不应该的呀
kun坤 2020-06-06 23:25:10 0 浏览量 回答数 0

问题

php死循环在独享主机上不能一直跑

因为业务需要,写了一个死循环用于网站的实时检测.本地apache跑一天都没问题.放到独享主机上面,跑半个小时就自己停了,试了好几次都是这样.下面是代码: ignore_user_abort(true); set_time_limit...
1023826349911945 2019-12-01 19:03:17 196 浏览量 回答数 1

问题

nginx 出现504 Gateway Time-out的解决方法

1.问题分析 nginx访问出现504 Gateway Time-out,一般是由于程序执行时间过长导致响应超时,例如程序需要执行90秒,而nginx最大响应等待时间为30秒,这样就会...
梦丫头 2019-12-01 21:38:23 1880 浏览量 回答数 3

问题

php版本osssdk的一个bug

php oss sdk 的read_dir方法有两处bug 1.调用方法是传入的第二个参数里面如果没有包含".|.." 传入的参数会把这个默认值覆盖掉,导致死循环。 2.原来的方法传入$recursive...
banditsmile 2019-12-01 22:05:21 4325 浏览量 回答数 1

回答

一、NGINX 502错误排查 NGINX 502 Bad Gateway错误是FastCGI有问题,造成NGINX 502错误的可能性比较多。将网上找到的一些和502 Bad Gateway错误有关的问题和排查方法列一下,先从FastCGI配置入手: 1.FastCGI进程是否已经启动 2.FastCGI worker进程数是否不够 运行 netstat -anpo | grep “php-cgi” | wc -l 判断是否接近FastCGI进程,接近配置文件中设置的数值,表明worker进程数设置太少 3.FastCGI执行时间过长 根据实际情况调高以下参数值 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; 4.FastCGI Buffer不够 nginx和apache一样,有前端缓冲限制,可以调整缓冲参数 fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; 5.Proxy Buffer不够 如果你用了Proxying,调整 proxy_buffer_size   16k; proxy_buffers    4 16k; 参见:http://www.server110.com 6.https转发配置错误 正确的配置方法 server_name www.mydomain.com; location /myproj/repos { set $fixed_destination $http_destination; if ( $http_destination ~* ^https(.*)$ ) { set $fixed_destination http$1; } proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Destination $fixed_destination; proxy_pass http://subversion_hosts; } 当然,还要看你后端用的是哪种类型的FastCGI,我用过的有php-fpm,流量约为单台机器40万PV(动态页面), 现在基本上没有碰到502。 7.php脚本执行时间过长 将php-fpm.conf的<value name="request_terminate_timeout">0s</value>的0s改成一个时间 二、Nginx 413错误的排查:修改上传文件大小限制 在上传时nginx返回了413错误,查看log文件,显示的错误信息是:”413 Request Entity Too Large”, 于是在网上找了下“nginx 413错误”发现需要做以下设置: 在nginx.conf增加 client_max_body_size的相关设置, 这个值默认是1m,可以增加到8m以增加提高文件大小限制; 如果运行的是php,那么还要检查php.ini,这个大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大,这样就不会因为提交数据大小不一致出现的错误。 post_max_size = 8M upload_max_filesize = 2M 三、Nginx 400错误排查:HTTP头/Cookie过大 今天有人汇报nginx的HTTP400错误,而且这个HTTP400错误并不是每次都会出现的,查了一下发现nginx400错误是由于request header过大,通常是由于cookie中写入了较长的字符串所引起的。 解决方法是不要在cookie里记录过多数据,如果实在需要的话可以考虑调整在nginx.conf中的client_header_buffer_size(默认1k) 若cookie太大,可能还需要调整large_client_header_buffers(默认4k),该参数说明如下: 请求行如果超过buffer,就会报HTTP 414错误(URI Too Long) nginx接受最长的HTTP头部大小必须比其中一个buffer大,否则就会报400的HTTP错误(Bad Request)。 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止。 Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI。 解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,而Nginx 504 Gateway Time-out则是与nginx.conf的设置有关。 而正确的设置需要考虑服务器自身的性能和访客的数量等多重因素。 以我目前的服务器为例子CPU是奔四1.5G的,内存1GB,CENTOS的系统,访客大概是50人左右同时在线。 但是在线的人大都需要请求PHP-CGI进行大量的信息处理,因此我将nginx.conf设置为: fastcgi_connect_timeout 300s; fastcgi_send_timeout 300s; fastcgi_read_timeout 300s; fastcgi_buffer_size 128k; fastcgi_buffers 8 128k;#8 128 fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; 这里最主要的设置是前三条,即 fastcgi_connect_timeout 300s; fastcgi_send_timeout 300s; fastcgi_read_timeout 300s; 这里规定了PHP-CGI的连接、发送和读取的时间,300秒足够用了,因此我的服务器很少出现504 Gateway Time-out这个错误。最关键的是php-fpm.conf的设置,这个会直接导致502 Bad Gateway和504 Gateway Time-out。 下面我们来仔细分析一下php-fpm.conf几个重要的参数: php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout” 我的两个设置的值一个是”40″,一个是”900″,但是这个值不是通用的,而是需要自己计算的。 计算的方式如下: 如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。 而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// nginx中配置php fastcgi组解决莫名其妙的502 Bad Gateway错误 一般nginx搭配php都采用这样的方式: location ~ .php$ { proxy_pass        http://localhost:9000; fastcgi_param   SCRIPT_FILENAME   /data/_hongdou$fastcgi_script_name; include        fastcgi_params; } 这个方式只能连接到一组spawn-fcgi开启的fastcgi,在服务器负载稍高时常常出现502 bad gateway错误。 起先怀疑这是php-cgi的进程开得太少,增加后仍然有反映时常有错,偶然间发现php-cgi会报出这样的错误: zend_mm_heap corrupted 看来是php-cgi在执行某些代码时有问题,以致于该线程中止。 在服务器上可能还会看到php-cgi进程在不断变少,估计是出现错误的php-cgi的进程自动退出了。 php的问题总是不太容易能解决,所以在nginx方面想想办法,nginx的好处是它总是能爆出一些稀奇古怪的做法出来。 在nginx的proxy中,规避莫名其妙错误的办法无非是proxy到一个upstream的服务器组中,然后配置 proxy_next_upstream,让nginx遇到某种错误码时,自动跳到下一个后端上。这样,应用服务器即使不稳定,但是在nginx后面就变成了稳定服务。想到nginx的fastcgi和proxy是一路东西,所以proxy能用的经验,移植到fastcgi也能跑得起来。 照着这个思路,用spawn-fcgi多开同样一组php进程,所不同的仅仅是端口: spawn-fcgi -a 127.0.0.1 -p 9000 -u nobody -f php-cgi -C 100 spawn-fcgi -a 127.0.0.1 -p 9001 -u nobody -f php-cgi -C 100 然后把fastcgi的这段配置改成用upstream的方式: upstream backend { server 127.0.0.1:9000; server 127.0.0.1:9001; } location ~ .php$ { fastcgi_pass        backend; fastcgi_param   SCRIPT_FILENAME   /data/_hongdou$fastcgi_script_name; include        fastcgi_params; } 检查配置结果正确,能跑起来;同时在服务器上netstat -n|grep 9000和grep 9001都有记录,证明连接无误;在前台查阅页面,一切运行正常。 这个配置是最简单的配置,既然能连接上upstream,那么很显然upstream的一些东西都可以拿来用,比如ip_hash、weight、max_fails等。 这样的配置在单机下不知能不能共享session,没有测试,如果有问题,可以加上ip_hash,或者配置php把session存进memcached中。 然后就是fastcgi_next_upstream的配置,nginx wiki中没有介绍到这个配置,查了一下,在nginx的CHANGES中有提到,而且出生年月是和proxy_next_upstream一样的。既然如此,那就照proxy_next_upstream一样配吧。一般按默认的值error timeout就可以工作,因为php出现502错误的异常是返回的500错误,所以我把fastcgi_next_upstream定为: fastcgi_next_upstream error timeout invalid_header http_500; 通过这个配置,就可以基本杜绝任何时常性的500错误,出问题的几率会变小很多,如果客户反映仍然激烈,那么就多增加几组fastcgi进程。
sosyxg 2019-12-02 02:43:07 0 浏览量 回答数 0

问题

PHP SDK开发包

PHP SDK 开发包 PHP SDK最新版本 点击查看 v2.0.5 aliyun-oss-php-sdk-2.0.5.zipaliyun-oss-php-sdk-2.0.5.phar v2.0.4 aliy...
青衫无名 2019-12-01 21:48:55 889 浏览量 回答数 0
阿里云企业服务平台 陈四清的老板信息查询 上海奇点人才服务相关的云产品 爱迪商标注册信息 安徽华轩堂药业的公司信息查询 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 天籁阁商标注册信息 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 北京芙蓉天下的公司信息查询