PHP程序在php执行正常,在CMD报扩展加载错误

 更新时间:2016年11月25日 17:37  点击:2386
写了一段程序可以在php中加载并调用扩展正常执行,但到了cmd调度模式时发现扩展加载加载错误了,下面来看问题的解决方法。

浏览器下PHP执行正常,在CMD报扩展加载错误,在dos的cmd模式下执行php,已加载的模块都不能使用。

PHP程序在php执行正常,在CMD报扩展加载错误

解决过程方法:

1.在命令行执行php时,使用php --ini命令先行查看php加载的配置文件的地址

PHP程序在php执行正常,在CMD报扩展加载错误

2.在PHP用浏览器形式访问PHP文件:

PHP程序在php执行正常,在CMD报扩展加载错误

输出PHPinfo看看  加载的php.ini文件是否一致。


方法:


在命令行执行php时,使用php -c "php.ini文件所在文件夹地址"来运行php文件
  PHP程序在php执行正常,在CMD报扩展加载错误

如果我们不仔细看会发现象mysql_fetch_array()和mysql_fetch_rows()函数没有什么区别,但是细细的看你会发现它们区别还是蛮大了,如果各位对于此函数的区别不了解下文小编给各位整理mysql_fetch_array()和mysql_fetch_rows()的用法与例子说紧。


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"));

Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。

一. 场景分析

业务服务压力比较大,想把一些占用资源的功能异步到远程处理,比如记录业务日志,文件加密,文件分发到其他文件服务器节点上,检查文件服务器是否已同步,对用户上传的图片进行剪裁生成多份缩略图,视频转换,静态内容生成,清除缓存等等,这些请求耗时长,占用系统资源大,影响业务正常访问。这些问题会经常遇到的,如果这些任务都在用户请求过程中完成,服务器撑不撑得住暂不考虑,单凭用户体验角度考虑来说,那是难以忍受的。

二. 解决之道

对于这种需求,我们可以通过分布式计算,对任务进行拆分,转移到多台服务器上进行异步或同步处理。分布式消息队列有多种实现方式如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添加任务,

流程图如下:

web架构

客户端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了。如有更好的应用可以相互交流。

var_dump函数方法是判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型,但小编在使用时碰到一个小问题,就是不会全部输出而是显示了省略号了,那么此问题如何解决呢

例子

$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显示长度的问题了,解决办法也简单了.

[!--infotagslink--]

相关文章

  • 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 409错误怎么解决呢?不少站长在遇到这个错误代码之后都一筹莫展,本次一聚教程网为大家带来了详细的说明,快来看看吧。 409错误是什么: HTTP 40...2017-01-22
  • 414错误是什么 414错误怎么解决

    414错误是HTTP协议状态码中的一种,很多都还不知道414错误是什么,以及不知道怎么解决414错误,那么就来看看小编带来的介绍吧。 414错误是什么: HTTP 414错误,(Requ...2017-01-22
  • http 405错误是什么 http 405错误怎么解决

    http 405错误是什么?http 405错误怎么解决?相信很多站长都在找这两个问题的答案,本次小编为大家带来了详细的教程,快来看看吧。 405错误是什么: HTTP 405错误是H...2017-01-22
  • 401错误码代表什么 401错误解决办法

    401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
  • http 402错误是什么 http 402简介

    http 402错误是什么?402错误较为少见,一般不轻易出现,下面小编就来告诉大家402错误是什么吧。 HTTP 402错误是HTTP状态码的一种,表示“要求付费”; 所求的...2017-01-22
  • 411错误是什么 411错误怎么解决

    411错误是HTTP协议状态码的一种,很多人都还不知道411错误是什么,本次一聚教程网将为大家进行解答,并且告诉大家411错误怎么解决。 411错误是什么: HTTP 411错误,(Lengt...2017-01-22
  • 404错误是什么 404错误怎么解决

    403错误是网站访问过程中,常见的错误提示。资源不可用,服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致,比如IIS或者apache设置了访问权限...2017-01-22
  • apache网站提示503错误解决办法

    Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • 403错误是什么 403错误怎么解决

    403错误是HTTP状态码的一种,属于“请示错误”,表示服务器拒绝请求。如果在搜索引擎尝试抓取您网站上的有效网页时显示此状态代码,那么,这可能是您的服务器或主机拒绝搜索...2017-01-22
  • 412错误是什么 412错误怎么解决

    412错误是什么?412错误怎么解决?本次一聚教程网将为大家带来详细的介绍,帮助大家全面了解412错误的意思以及解决412错误的方法。 412错误是什么: HTTP 412错误,(Precond...2017-01-22
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现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
  • 406错误是什么 406错误怎么解决

    HTTP 406错误是HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型。 而MIME类型是在把输出...2017-01-22
  • 407错误是什么 407错误怎么解决

    407错误是什么?407错误怎么解决?不少站长都遇到过407错误,下面小编将告诉大家如何处理407错误。 407错误是什么: HTTP 407错误是HTTP协议状态码的一种,表示需要代...2017-01-22
  • 410错误是什么 http 410错误怎么解决

    410错误是HTTP协议状态码的一种,本次一聚教程网将为大家详细介绍HTTP 410错误是什么,以及410错误的解决办法。 410错误是什么: HTTP 410错误是HTTP协议状态码的...2017-01-22
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • HTTP 400错误是什么 HTTP 400错误怎么解决

    每当遇到http错误代码为400,代表客户端发起的请求不符合服务器对请求的某些限制,或者请求本身存在一定的错误,那么HTTP 400错误怎么解决呢?请看下文介绍。 目前400错...2017-01-22