PHP Startup: Unable to load dynamic library

 更新时间:2016年11月25日 15:28  点击:1822
昨天帮一朋友配置服务器结果发现apache日志中有PHP Warning: PHP Startup: Unable to load dynamic library 提示了,然后调试数据库连接发现提示Call to undefined function mysql_connect()错误,这样就想到了是mysql没有加载成功了,下面我们一起来看看问题解决办法。


连接代码

<?php
echo 'a';
$cn = mysql_connect("localhost",'你的mysql用户名','你的mysql用户密码') or die(mysql_error());
if( $cn )
{
  echo phpinfo();
}
else
{
 echo 'mysql connect fail';
}
?>

因为服务器使用的是安全php.ini所在没有错误显示,于时相看了apache安装目录的logs的errors.log日志文

件发现如下错误

PHP Warning:  PHP Startup: Unable to load dynamic library

'D:\myserver\php\ext\php_mysql.dll' - xd5xd2xb2xbbxb5xbdxd6xb8xb6xa8xb5xc4xc4

xa3xbfxe9xa1xa3rn in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library

'D:\myserver\php\ext\php_mysqli.dll' - xd5xd2xb2xbbxb5xbdxd6xb8xb6xa8xb5xc4

xc4xa3xbfxe9xa1xa3rn in Unknown on line 0

 

[Tue Dec 31 09:05:15 2013] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined

function mysql_connect() in E:\www\a.php on line 2, referer: http://localhost/
[Tue Dec 31 09:05:16 2013] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined

function mysql_connect() in E:\www\a.php on line 2, referer: http://localhost/
[Tue Dec 31 09:05:17 2013] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined

function mysql_connect() in E:\www\a.php on line 2, referer: http://localhost/
[Tue Dec 31 09:06:04 2013] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined

function mysql_connect() in E:\www\a.php on line 3, referer: http://localhost/
[Tue Dec 31 09:06:05 2013] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined

function mysql_connect() in E:\www\a.php on line 3, referer: http://localhost/
[Tue Dec 31 09:06:05 2013] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined

function mysql_connect() in E:\www\a.php on line 3, referer: http://localhost/
[Tue Dec 31 09:06:05 2013] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined

function mysql_connect() in E:\www\a.php on line 3, referer: http://localhost/
[Tue Dec 31 09:06:06 2013] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined

function mysql_connect() in E:\www\a.php on line 3, referer: http://localhost/
[Tue Dec 31 09:06:06 2013] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined

function mysql_connect() in E:\www\a.php on line 3, referer: http://localhost/

日志中有这么一句

PHP Startup: Unable to load dynamic library  'D:\myserver\php\ext\php_mysql.dll' 这个意思是

没有加载成功php_mysql文件了,还有一点是提示 PHP Fatal error:  Call to undefined function

mysql_connect(),,这个是mysql没有连接成功也就是加载mysql库失败了,根据分析有两种可能一是文件不

存在,这个问题不存因为我以前用的是这个php解压包,2是服务器环境变量问题,如果是环境变量有两种解

决办法


1,是直接在windows增加环境变量

2,直接把在d:PHP里找到php5ts.dll,libmysql.dll将其复制到c:/winnt/system32下(winNT/2000的机器),

而winXP/2003是复制到c:/windows/system32下即可

记住复制到system目录之后必须重记apache环境,如我再测试http://localhost/a.php 就可以看到

输出的phpinfo相关信息了,本站原创文章转载注明来源www.111cn.net

在自己编辑安装php时提示 checking for mysql_close in -lmysqlclient_r… no ,看这句我看是什么mysql问题,但结果是不是它的问题呢,下面我们一起来看看。

又在折腾服务器了~记录下自己编译php5.3.24的过程。执行了以下的 configure配置命令:

 

 代码如下 复制代码

    ./configure
    --prefix=/usr/local/php
    --with-config-file-path=/usr/local/php/etc
    --with-config-file-scan-dir=/usr/local/php/etc/conf.d
    --enable-fpm
    --with-fpm-user=webserver
    --with-fpm-group=webserver
    --with-curl
    --with-pear
    --with-gd
    --with-jpeg-dir
    --with-png-dir
    --with-zlib
    --with-xpm-dir
    --with-freetype-dir
    --with-mcrypt
    --with-mhash
    --with-mysql=/usr/local/mysql
    --with-mysqli=/usr/local/mysql
    --with-pdo-mysql=/usr/local/mysql
    --with-openssl
    --with-xmlrpc
    --with-xsl
    --with-bz2
    --with-gettext
    --disable-debug
    --enable-fpm
    --enable-exif
    --enable-wddx
    --enable-zip
    --enable-bcmath
    --enable-calendar
    --enable-ftp
    --enable-mbstring
    --enable-soap
    --enable-sockets
    --enable-sqlite-utf8
    --enable-shmop
    --enable-dba
    --enable-sysvsem
    --enable-sysvshm
    --enable-sysvmsg

遇到了如下错误:

    checking for mysql_close in -lmysqlclient_r... no
    checking for mysql_error in -lmysqlclient_r... no
    configure: error: mysql configure failed. Please check config.log for more information.

查证、搜索后,找到一blog,讲是这样的原因:

    See this bug report: http://www.111cn.net
    If you need libmysql, apply the patch or create the symlink.
    Better: Switch to mysqlnd

我也就把对于mysql, mysqli, pdo的配置选项改成了:

 代码如下 复制代码

    --with-mysql=mysqlnd
    --with-mysqli=mysqlnd
    --with-pdo-mysql=mysqlnd

编译通过~

本文章一给大家介绍php.ini中session和cookie有关的配置详解,希望此教程对各位同学会有所帮助。

1,session.use_cookie = 1

是否采用Cookie方法传递session id值。默认是1,表示启用。

2,session.name = PHPSESSID

不 管是Cookie传递sessioin_id,还是GET方法传递session_id,都需要使用键值。他们的格式分别是Cookie:  sess_name=session_id;和/path.php?sess_name=session_id,其中sess_name就是由这里指定 的。

3,session.use_only_cookies = 0

表示只使用Cookie 的方法传递session id。我们说过,传递cookie的方法,除了cookie,还有GET方法,GET方法是不安全的方法。在用户端禁用了cookie的时候,会采用 GET方法传递session_id,可以通过这个设置尽用GET方法传递session_id。

4,session.cookie_lifetime = 0, session.cookie_path = / 以及session.cookie_domain =
如 果使用Cookie方法传递session_id的话,这里分别指定了cookie有效域、目录和时间。分别对应setcookie()函数的形 参$expire、$path和$domain。其中cookie_lifetime=0表示直到关闭浏览器才删除Cookie。还可以使用 session_set_cookie_params()函数修改这些值。

5,session_name([string $name])

获 取或更新session_name。如果传了name,则表示不使用默认的名称PHPSESSID(由session.name)指定,否则获取当前 session_name。注意:如果设置session_name,则必须在session_start()之前调用才生效。

6,session_id([string $id])

与session_name()类似,但它是读取或者设置session_id的方法。同样,设置session_id的话,必须在session_start()之前调用才有效。

7,session_set_cookie_params()和session_get_cookie_params()

通 过session_set_cookie_params()可以重新设定session.cookie_lifetime, session.cookie_path以及session.cookie_domain这三个php.ini设置。而 session_get_cookie_params()则是获取这些设定的值

在PHP中 Session配置我们可以直接在php.ini中进行设置,下面我来给各位介绍在php.ini中具体配置session的一些参考说明。


php.ini中的session配置说明

  下面介绍能让session运行的必要配置步骤

  手动配置PHP运行环境时,最容易遗忘的一项是服务器端session文件的存储目录配置工作,打开php.ini文件,搜索Session,找到session.save_path,默认值为/tmp,代表session文件保存在c:/tmp目录下,默认tmp目录并没有创建,你可以在c盘下创建tmp目录,或者创建一个其他目录,比如leapsoulcn,再修改session.save_path的值,并去掉;,即

  session.save_path = ‘/leapsoulcn’;

  注意事项:

  1、一般为了保证服务器的安全,session.save_path值最好设置为外网无法访问的目录,另外如果你是在linux服务器下进行session配置,请务必同时配置此目录为可读写权限,否则在执行session操作时会报错。

  2、在使用session变量时,为了保证服务器的安全性,最好将register_globals设置为off,以保证全局变量不混淆,在使用session_register()注册session变量时,你可以通过系统全局变量$_SESSION来访问,比如你注册了leapsoulcn变量,你可以通过$_SESSION['leapsoulcn']来访问此变量。PHP环境变量$_SERVER和系统常量详细说明

  session.save_path配置其他说明事项,从php.ini配置文件翻译而来

  你可以使用”N;[MODE;]/path”这样模式定义该路径,N是一个整数,表示使用N层深度的子目录,而不是将所有数据文件都保存在一个目录下。

  [MODE;]可选,必须使用8进制数,默认600(=384),表示每个目录下最多保存的会话文件数量。[MODE;]并不会改写进程的umask。php不会自动创建这些文件夹结构。可使用ext/session目录下的mod_files.sh脚本创建。如果该文件夹可以被不安全的用户访问(比如默认的”/tmp”),那么将会带来安全漏洞。当N>0时自动垃圾回收将会失效,具体参见下面有关垃圾搜集的部分。

  如果你服务器上有多个虚拟主机,建议针对每个不同的虚拟主机分别设置各自不同的目录。

  至此最基本的session配置就完成了,你只要保存php.ini,并重启apache,即可使用session功能。

  其他session配置说明

  session.save_handler = ”files”

  默认以文件方式存取session数据,如果想要使用自定义的处理器来存取session数据,比如数据库,用”user”。

  session.use_cookies = 1

  是否使用cookies在客户端保存会话sessionid,默认为采用cookies

  session.use_only_cookies = 0

  是否仅仅使用cookie在客户端保存会话sessionid,这个选项可以使管理员禁止用户通过URL来传递id,默认为0,如果禁用的话,客户端如果禁用Cookie将使session无法工作。

  session.name = “PHPSESSID”

  当做cookie name来使用的session标识名

  session.auto_start = 0

  是否自动启动session,默认不启动,我们知道在使用session功能时,我们基本上在每个php脚本头部都会通过session_start()函数来启动session,如果你启动这个选项,则在每个脚本头部都会自动启动session,不需要每个脚本头部都以session_start()函数启动session,推荐关闭这个选项,采用默认值。

  session.cookie_lifetime = 0

  传递sessionid的Cookie有效期(秒),0表示仅在浏览器打开期间有效。

  session.gc_probability = 1

  session.gc_divisor = 100

  定义在每次初始化会话时,启动垃圾回收程序的概率。计算公式如下:session.gc_probability/session.gc_divisor,比如1/100,表示有1%的概率启动启动垃圾回收程序,对会话页面访问越频繁,概率就应当越小。建议值为1/1000~5000。

  session.gc_maxlifetime = 1440

  设定保存的session文件生存期,超过此参数设定秒数后,保存的数据将被视为’垃圾’并由垃圾回收程序清理。判断标准是最后访问数据的时间(对于FAT文件系统是最后刷新数据的时间)。如果多个脚本共享同一个session.save_path目录但session.gc_maxlifetime不同,将以所有session.gc_maxlifetime指令中的最小值为准。

  如果你在session.save_path选项中设定使用子目录来存储session数据文件,垃圾回收程序不会自动启动,你必须使用自己编写的shell脚本、cron项或者其他办法来执行垃圾搜集。

  比如设置”session.gc_maxlifetime=1440″ (24分钟):

  cd /path/to/sessions; find -cmin +24 | xargs rm

  以上是一些常用的session配置选项说明,更多的session配置选项说明你可以参考php.ini文件中的说明。

  至此,在php.ini配置文件中对session进行配置的PHP教程就介绍完毕了,通过上面的步骤实践与学习,基本的session功能都可以使用,至于session性能等其他方面则需要根据服务器环境和需求进行微调了,这个得自己体会。

附一表

[Session]
session.save_handler      = files   ; 用于保存/取回数据的控制方式
session.save_path         = C:wintemp    ; 在 save_handler 设为文件时传给控制器的参数,
                                    ; 这是数据文件将保存的路径。
session.use_cookies       = 1       ; 是否使用cookies
session.name              = PHPSESSID 
                                    ; 用在cookie里的session的名字
session.auto_start        = 0       ; 在请求启动时初始化session
session.cookie_lifetime   = 0       ; 为按秒记的cookie的保存时间,
                                    ; 或为0时,直到浏览器被重启
session.cookie_path       = /       ; cookie的有效路径
session.cookie_domain     =         ; cookie的有效域
session.serialize_handler = php     ; 用于连接数据的控制器
                                    ; php是 PHP 的标准控制器。
session.gc_probability    = 1       ; 按百分比的'garbage collection(碎片整理)'进程
                                    ; 在每次 session 初始化的时候开始的可能性。
session.gc_maxlifetime    = 1440    ; 在这里数字所指的秒数后,保存的数据将被视为
                                    ; '碎片(garbage)'并由gc 进程清理掉。
session.referer_check     =         ; 检查 HTTP引用以使额外包含于URLs中的ids无效
session.entropy_length    = 0       ; 从文件中读取多少字节
session.entropy_file      =         ; 指定这里建立 session id
; session.entropy_length    = 16
; session.entropy_file      = /dev/urandom
session.cache_limiter     = nocache ; 设为{nocache,private,public},以决定 HTTP 的
                                    ; 缓存问题
session.cache_expire      = 180     ; 文档在 n 分钟后过时
session.use_trans_sid     = 1       ; 使用过渡性的 sid 支持,若编译时许可了
                                    ;  --enable-trans-sid
url_rewriter.tags         = "a=href,

之前工作中必须和国外服务器打交道,延迟和丢包问题有时候非常严重,已经到了不可忍受的地步,输入一条sql都是很费劲的事情。google搜了一遍没有找到非阻塞的ssh客户端,PHP有SSH2扩展,利用标准输入输出理论上可以实现一个基于命令的SSH客户端,这样就解决了网络问题带来的不便,于是开发了一个PHP非阻塞SSH客户端

价值:

  • 基于命令,最大程度解决了网络延迟和丢包问题。
  • windows和Linux下测试通过。

不足:

  • 没有自动补全功能
  • 没有sftp和scp等其他功能
  • 没有颜色和粗体显示
  • 个别情况下显示上不是很完美
  • 因为现在基本不用它了,所以暂时先不进行改进。

linux 运行效果
2013-02-04_133311
windows下运行效果
2013-02-04_133509
2013-02-04_133727
2013-02-04_133842

因为是框架中的一个类,所以个别通用函数(比如debug_print())需要自己提供,我这里就不改写了

 代码如下 复制代码

<?php
class FSSH{
 private $conn;
 private $shell;

 /**
 * key=String 密码认证,key=array('pub'=>,'pri'=>,'type'=>,'phrase'=>)密钥认证
 * 密钥认证type分为两种:ssh-rsa,ssh-dss
 * $host[addr]=String 地址,$host['fp']=array() 服务器指纹
 */
 function __construct($host,$user,$key){
  if(empty($host['addr'])){
   debug_print('Host cant't be empty',E_USER_ERROR);
  }
  if(empty($host['fp'])){
   debug_print('finger print is not specified',E_USER_ERROR);
  }
  $this->stdin=fopen('php://stdin','r');
  $this->stdout=fopen('php://stdout','w');
  if(false!==strpos($host['addr'],':')){
   $temp=explode(':',$host['addr']);
   $host['addr']=$temp[0];
   $port=$temp[1];
  }else{
   $port=22;
  }
  if(is_string($key) || empty($key['type'])){
   $methods=null;
  }else{
   $methods=array('hostkey'=>$key['type']);
  }
  $conn=ssh2_connect($host['addr'],$port,$methods,array('disconnect'=>array($this,'disconnect')));
  $fp=ssh2_fingerprint($conn,SSH2_FINGERPRINT_MD5);
  $success=false;
  $fpOK=false;
  if(in_array($fp,$host['fp'])){
   $fpOK=true;
  }else{
   fwrite($this->stdout,"$fpnIs fingerprint OK ?(y/n)");
   $input=strtolower(stream_get_line($this->stdin,1));
   if($input=='y'){
    $fpOK=true;
   }else{
    $fpOK=false;
   }
  }
  if($fpOK){
   if(is_array($key)){
    if (ssh2_auth_pubkey_file($conn,$user,$key['pub'],$key['pri'],$key['phrase'])){
     $success=true;
    }else{
     debug_print('Public Key Authentication Failed',E_USER_ERROR);
    }
   }elseif(is_string($key)){
    if(ssh2_auth_password($conn,$user,$key)){
     $success=true;
    }else{
     debug_print('Password Authentication Failed',E_USER_ERROR);
    }
   }
  }else{
   debug_print('Fingerprint is invalid',E_USER_ERROR);
  }
  if($success){
   $this->conn=$conn;
   $this->shell=ssh2_shell($conn,null,null,1024);
  }
  return $success;
 }

 function shell(){
  //最后一条命令
  $last='';
  //先结束shell,再结束while
  $signalTerminate=false;
  while(true){
   $cmd=$this->fread($this->stdin);
   $out=stream_get_contents($this->shell,1024);
   if(!empty($out) and !empty($last)){
    $l1=strlen($out);
    $l2=strlen($last);
    $l=$l1>$l2?$l2:$l1;
    $last=substr($last,$l);
    $out=substr($out,$l);
   }
   echo ltrim($out);
   if($signalTerminate){
    break;
   }
   if(in_array(trim($cmd),array('exit'))){
    $signalTerminate=true;
   }
   if(!empty($cmd)){
    $last=$cmd;
    fwrite($this->shell,$cmd);
   }
  }
 }

 //解决windows命令行的读取问题,没有别的办法了。
 private function fread($fd){
  static $data='';
  $read = array($fd);
  $write = array();
  $except = array();
  $result = stream_select($read,$write,$except,0,1000);
  if($result === false)
   debug_print('stream_select failed',E_USER_ERROR);
  if($result !== 0){
   $c= stream_get_line($fd,1);
   if($c!=chr(13))
    $data.=$c;
   if($c==chr(10)){
    $t=$data;
    $data='';
    return $t;
   }
  }
 }

 function __destruct(){
  fclose($this->stdin);
  fclose($this->stdout);
  $this->disconnect();
 }

 private function disconnect(){
  if(is_resource($this->conn)){
   unset($this->conn);
   fclose($this->shell);
  }
 }
}


demo

 代码如下 复制代码

//$ssh=new FSSH(array('addr'=>'x.x.x.x:22','fp'=>array('')),'tunnel',array('pub'=>'E:Identity.pub','pri'=>'E:Identity','type'=>'ssh-rsa'));
$ssh=new FSSH(array('addr'=>'192.168.2.205','fp'=>array('54ECC700B844DCF0D40554A56C57C01E')),'root','123456');
$ssh->shell();

[!--infotagslink--]

相关文章