PHP程序在php执行正常,在CMD报扩展加载错误
浏览器下PHP执行正常,在CMD报扩展加载错误,在dos的cmd模式下执行php,已加载的模块都不能使用。
解决过程方法:
1.在命令行执行php时,使用php --ini命令先行查看php加载的配置文件的地址
2.在PHP用浏览器形式访问PHP文件:
输出PHPinfo看看 加载的php.ini文件是否一致。
方法:
在命令行执行php时,使用php -c "php.ini文件所在文件夹地址"来运行php文件
mysql_fetch_array()函数参数
mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有
返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false。
mysql_fetch_array(data,array_type)
array_type如下
MYSQL_ASSOC - 关联数组
MYSQL_NUM - 数字数组
MYSQL_BOTH - 默认。同时产生关联和数字数组
mysql_fetch_rows()函数参数
mysql_fetch_row() 函数从结果集中取得一行作为数字数组。
mysql_fetch_row(data)
从上面来看它们都是使用的数据指针。该数据指针是 mysql_query() 函数产生的结果了,但后面有一个参数是不一样的,mysql_fetch_array()有array_type参数而mysql_fetch_rows()没有。
那么用法有什么区别,下面看个例子
mysql_fetch_array()和mysql_fetch_rows()都能获取数据库的字段数据,具体区别可参照以www.111cn.net整理的实例:
mysql_fetch_array()函数例子
<?php
$sql=”select * from user “;
$query=mysql_query($sql);
$result=mysql_fetch_array($query);
echo $result[name];
echo $resutlt[password];
?>
mysql_fetch_rows()函数例子
<?php
$sql=”select * from user “;
$query=mysql_query($sql);
$result=mysql_fetch_rows($query);
echo $result[1];
echo $resutlt[2];
?>
总结,mysql_fetch_array()是数组并且可以关联数组,而mysql_fetch_rows是对象不能关联数组,区别就在这里了
php函数cul调用远程地址时提示 HTTP Status 415 错误,折腾了好久才发现是没有指定Request Header 信息。下面来看具体解决过程。使用php curl的方式调用对方提供的接口,收到了如下错误提示
HTTP Status 415
The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.
Curl 的代码片段如下:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_NOBODY, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));
$data = curl_exec($ch);
curl_close($ch);
多次检查curl设置已经接口的说明没有发现问题。对方的服务器使用的是Tomcat 7, 一度怀疑是对方web配置有误,后来仔细研究文档,其中提到Response是jason格式文档,而上述curl中没有指定Request Header 信息, 所以尝试加入一个header, 结果问题解决。 代码如下:
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json; charset=utf-8"));
一. 场景分析
业务服务压力比较大,想把一些占用资源的功能异步到远程处理,比如记录业务日志,文件加密,文件分发到其他文件服务器节点上,检查文件服务器是否已同步,对用户上传的图片进行剪裁生成多份缩略图,视频转换,静态内容生成,清除缓存等等,这些请求耗时长,占用系统资源大,影响业务正常访问。这些问题会经常遇到的,如果这些任务都在用户请求过程中完成,服务器撑不撑得住暂不考虑,单凭用户体验角度考虑来说,那是难以忍受的。
二. 解决之道
对于这种需求,我们可以通过分布式计算,对任务进行拆分,转移到多台服务器上进行异步或同步处理。分布式消息队列有多种实现方式如rabbitmq、gearman等。 在这里主要说gearman—分布式处理系统。gearman由三部分组成:Job server,worker server,client server。 任务服务器job server运行这gearmand进程,来负责处理应用的远程调用请求,并且维护计算任务;工作服务器worker server负责向job server注册函数等待领取任务并执行实际的计算,然后将结果返回给job server;客户端client server提供gearman client API给应用程序调用,API支持多种语言如C、php、perl、python、mysql udf、java、ruby、go等等,主要是向job server添加任务,
流程图如下:
客户端client server向gearman添加任务时,有三种模式:
1. 同步顺序处理 相当于消息队列,先进先出。
2. 同步并行处理 这种模式会阻塞后面的运行,将互不依赖的任务并行处理,大大缩短整体处理时间。
3. 异步后台处理 将耗时任务交给后台处理,不阻塞当前进程。
三. 应用实例
需要安装的模块有Mail::SendEasy、Gearman::Worker、Gearman::Client、JSON。
# perl -MCPAN -e 'install Mail::SendEasy Gearman::Worker Gearman::Client JSON'
或通过cpanm来安装
在使用异步处理之前,当我们要发送邮件时,会直接这么写,代码如下:
代码如下 | 复制代码 |
use strict; use Mail::SendEasy ; my $mail = new Mail::SendEasy( smtp => 'smtp.ttlsa.com' , user => 'service@ttlsa.com' , pass => 'QQ_qun:39514058', ); my $status = $mail->send( from => 'service@ttlsa.com' , from_title => $mail_title , to => $mail_to , subject => $mail_subject , msg => $mail_msg , html => "<b>$mail_msg</b>" , ); if (!$status) { print $mail->error ;} |
这存在一个问题, 会长期阻塞在send函数,而无限制等待下去, 直到超时,很可能会拖垮服务器的。我们可以使用gearman,来改变这种发送邮件的方式。第一步,创建一个worker实例SENDMAIL,并向job server注册,等待接收任务并执行发送邮件的操作。第二步,客户端只需要将发送邮件的任务丢给job server便退出,没你什么事了。上代码:
代码如下 | 复制代码 |
# vim work_SENDMAIL.pl use strict; use Mail::SendEasy ; use Gearman::Worker; use JSON; use Data::Dumper; my $gearman_server='127.0.0.1:4730'; my $worker=new Gearman::Worker; $worker->job_servers($gearman_server); $worker->register_function(SENDMAIL=>\&sendmail); $worker->work while 1; sub sendmail{ my $job=shift; my $param=$job->arg; my $json = JSON->new->allow_nonref; my $hash_ref=$json->decode($param); my $addr=$hash_ref->{'email'}; my $subject=$hash_ref->{'subject'}; my $msg=$hash_ref->{'msg'}; my $mail = new Mail::SendEasy( smtp => 'smtp.ttlsa.com' , user => 'service@ttlsa.com' , pass => 'QQ_qun:39514058', ); my $status = $mail->send( from => 'service@ttlsa.com' , from_title => $subject , to => $addr , subject => $subject , msg => $msg , html => "<b>$msg</b>" , ); if (!$status) { print $mail->error ;} } # vim gearman_client.pl use strict; use Gearman::Client; use JSON; my $gearman_server="127.0.0.1:4730"; my $worker='SENDMAIL'; my $data={}; $data->{'subject'} = "www.ttlsa.com --- Operation & Maintenance of Time To Live"; $data->{'msg'} = "Date: gettime() $data->{'email'} = '710117291@qq.com'; my $json = JSON->new->allow_nonref; my $param=$json->encode($data); gearman_add_job($gearman_server,$worker,$param,2); sub gearman_add_job { my $server=shift; my $function_name=shift; my $function_param=shift; my $level=shift or 1; my $gearman_client = Gearman::Client->new; $gearman_client->job_servers($server); if($level == 1){ my $result = $gearman_client->do_task($function_name,\$function_param,{}); } elsif($level == 2){ my $result = $gearman_client->dispatch_background($function_name, \$function_param,{}); } } sub gettime { my @time=(localtime)[5,4,3,2,1,0]; $time[0]+=1900; $time[1]+=1; return sprintf("%04u-%02u-%02u %02u:%02u:%02u",@time); } |
完成上面的改造不要认为解决了发送邮件会长期阻塞在send函数,而无限制等待下去的问题了。这其实只是解决了一部分,还有一个问题需要考虑进去,既然采用了异步方式,那么应用程序是不知道邮件是否发送成功的,因此需要记录任务执行的结果,可以将结果写入数据库,定期的对发送失败的邮件进行再次发送,或写个异常处理的worker,捕获发送邮件异常,进行多次尝试发送。
这种方案是我在捕获数据库备份过程中失败时,发邮件报警的应用。
通过这样的异步任务处理,可以很好的解决前面场景提到的问题,完全取决于如何应用gearman了。如有更好的应用可以相互交流。
例子
$a = array (1, 2, array ("a", "b", "c"));
var_dump ($a);
上面是不会有问题了,比较短时发现可以正常了.
安装了xdebug模块后,var_dump()输出的结果将比较易于查看,但默认情况下,var_dump() 输出的结果将有所变化:过多的数组元素不再显示,字符串变量将只显示前N个字符,较深的数组元素也被显示成省略号。这点会带来一些不便,我们修改配置文件,设置这些。
在php.ini里的xdebug节点中,加入如下
xdebug.var_display_max_children=128
xdebug.var_display_max_data=512
xdebug.var_display_max_depth=5
好了这样问题就解决 了,主要就是一个display显示长度的问题了,解决办法也简单了.
相关文章
Ecshop提示Only variables should be passed by reference in错误
在安装好ecshop软件之后我们打开首页时提示Only variables should be passed by reference in错误了,碰到这个问题是什么原因呢?下面我们就一起来看看解决办法吧。...2016-11-25- 409错误是什么?http 409错误怎么解决呢?不少站长在遇到这个错误代码之后都一筹莫展,本次一聚教程网为大家带来了详细的说明,快来看看吧。 409错误是什么: HTTP 40...2017-01-22
- 414错误是HTTP协议状态码中的一种,很多都还不知道414错误是什么,以及不知道怎么解决414错误,那么就来看看小编带来的介绍吧。 414错误是什么: HTTP 414错误,(Requ...2017-01-22
- http 405错误是什么?http 405错误怎么解决?相信很多站长都在找这两个问题的答案,本次小编为大家带来了详细的教程,快来看看吧。 405错误是什么: HTTP 405错误是H...2017-01-22
- 401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
- http 402错误是什么?402错误较为少见,一般不轻易出现,下面小编就来告诉大家402错误是什么吧。 HTTP 402错误是HTTP状态码的一种,表示“要求付费”; 所求的...2017-01-22
- 411错误是HTTP协议状态码的一种,很多人都还不知道411错误是什么,本次一聚教程网将为大家进行解答,并且告诉大家411错误怎么解决。 411错误是什么: HTTP 411错误,(Lengt...2017-01-22
- 403错误是网站访问过程中,常见的错误提示。资源不可用,服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致,比如IIS或者apache设置了访问权限...2017-01-22
- Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 403错误是HTTP状态码的一种,属于“请示错误”,表示服务器拒绝请求。如果在搜索引擎尝试抓取您网站上的有效网页时显示此状态代码,那么,这可能是您的服务器或主机拒绝搜索...2017-01-22
- 412错误是什么?412错误怎么解决?本次一聚教程网将为大家带来详细的介绍,帮助大家全面了解412错误的意思以及解决412错误的方法。 412错误是什么: HTTP 412错误,(Precond...2017-01-22
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
用js的document.write输出的广告无阻塞加载的方法
一、广告代码分析很多第三方的广告系统都是使用document.write来加载广告,如下面的一个javascript的广告链接。复制代码 代码如下:<script type="text/javascript" src="http://gg.5173.com/adpolestar/5173/;ap=2EBE5...2014-06-07- HTTP 406错误是HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型。 而MIME类型是在把输出...2017-01-22
- 407错误是什么?407错误怎么解决?不少站长都遇到过407错误,下面小编将告诉大家如何处理407错误。 407错误是什么: HTTP 407错误是HTTP协议状态码的一种,表示需要代...2017-01-22
- 410错误是HTTP协议状态码的一种,本次一聚教程网将为大家详细介绍HTTP 410错误是什么,以及410错误的解决办法。 410错误是什么: HTTP 410错误是HTTP协议状态码的...2017-01-22
- 这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
- 每当遇到http错误代码为400,代表客户端发起的请求不符合服务器对请求的某些限制,或者请求本身存在一定的错误,那么HTTP 400错误怎么解决呢?请看下文介绍。 目前400错...2017-01-22