PHP中mssql_connect()函数无效的解决方案

 更新时间:2016年11月25日 17:37  点击:1900
PHP中mssql_connect()函数无效目前有两种情况,php5.3之前的版本可能是因为ntwdblib.dll文件版本与目录问题,如果是之后配置与之前版本有一些区别,下面来看看吧

php5.3之前的版本我给大家一个解决方案

第一步,检查你的程序是否存在问题,排除程序自身的问题。

第二步,要将服务器端的C:/windows/system32下的ntwdblib.dll和PHP安装目录下的ntwdblib.dll的版本号保持一致!

上述两步基本上就可以解决mssql_connect()函数无效的问题了!(这个问题害的我研究了半天!)

php5.3之后的版本如下

windows系统下,PHP5.3以上的版本已经不支持mssql扩展.

首先http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx 点击 get it 下载SQLSRV20.EXE。
将文件解压到php的扩展文件夹ext下,打开php.ini在结尾添加:


[PHP_PDO_SQLSRV]

extension=php_pdo_sqlsrv_53_nts_vc6.dll

[PHP_SQLSRV]

extension=php_sqlsrv_53_nts_vc6.dll

好了这样就搞定了哦.

开发项目都是本地修改代码然后发布到测试环境,测试稳定后才发布上线,所以测试环境的好坏会影响到开发效率及开发质量,本文我伙来看看利用 Gentle 帮助我们快速的将代码部署到测试环境。

我想很多开发的同学都经历过这样的开发流程:本地修改代码,把代码推到测试环境,重启测试环境需要的服务,本地看效果,改bug重复1-3,功能稳定后上线

这个过程有什问题呢?

    假设你是一个做过运维或者能力很强的人,比如我这种,本地跑测试环境,但是假如一个新人,或者对测试环境中的某些 部分不是很了解的人, 甚至需要和生产环境完全一样的条件下, 本地可能就不好使了. 那么这需要一个测试服务器
    首先你每次修改代码, push ,重启环境都需要你登陆测试环境,至少不够自动化.然后退回本地看效果,这个过程有点浪费时间和经理
    其次是你可能有好几个项目,他们之间可能都没什么共通点. 你需要多个测试环境
    当然你可以写几个脚本,为你每个测试环境写一个东西去自动化这些,未尝不可. 只是需要重复造很多轮子
    假如为了安全有跳板机,你需要登陆跳板机才能跳到你的测试服务器,你可能要写很复杂的expect脚本

然后是我认为最重要的:


凡是屁大点事就放个deamon的运维都是耍流氓, 就拿小屁几台服务器还搞神马salt, ansible之类的事情,真是太无聊了.

这些东西帮助你做了很多事情,但是会让你变得更懒.而且重要的是-它们写的并不一定只符合你的需要或者就不符合你的需要. 我喜欢简单粗暴的实现,最近在看fabric的代码, 作为做过op,也给salt贡献过代码的我,写了这个东西: gentle, 帮助我自动化提交代码到我的测试环境. 这个东西是我认为符合我需要,或者大部分开发同学需要的小东西,基于fabric, docopt 和yaml.
我的工作的一些特点

我负责几个项目, 它们有以下特点

    项目在不同的机房, 有完整的测试环境和相关数据
    项目依赖的服务基本不同,比如有的使用了supervisor, 有的是程序fork后退出了父进程;有的使用了nginx+uwsgi,有的就是nginx+服务等.
    项目之间需要的依赖应用不同,且启动顺序有区别. 这个很好理解, 启动需要先启动A,再启动B,才能启动C
    项目有的需要登陆跳板机

我以前的个人的开发习惯和流程


    我有一个专门的存放服务配置的目录, 后缀是ip或者项目的名字. git版本库, 每次更新后上传到测试环境
    我有专门的op PATH, 做了很多alias, 都是一些python或者shell的脚本,用来同步测试环境,登陆测试环境撑起服务的脚本

看起来以前用的也不错. 但是gentle能怎么样提高呢?

gentle的开发流程

    切换到你要开发的目录
    初始化这个目录,其实就是在当前目录增加一个.gentle.yaml
    根据你的需要配置测试环境账号ip密码, 想要同步的目录, 需要重启的服务和优先级已经命令
    以后每次只需在这个目录下,使用gt publish 或者更懒 gt p, 他就会帮你自动rsync然后重启相关服务.

具体使用可以去我的github或者readthedocs.org

安装和依赖


我已经放到了pypi, 你可以使用pip或者easy_install

sudo pip install gentle

这样在系统环境下会有一个gt命令

fabric有2个对于项目更新的函数,一个是rsync_project,一个是upload_project, upload是把项目压缩在服务器上解压缩,实际上很浪费时间,但是rsync_project不能使用env.password,需要手动输入一次密码,都很不爽,我找到一个解决办法就是sshpass, 帮助自动输入rsync的密码, 我也给fabric提了PR. 我的项目使用了我个人的改进版的rsync_project

如果你是ubuntu 直接:

sudo apt-get install sshpass

其他操作系统可以在这里下载 http://sourceforge.net/projects/sshpass/ 然后编译

tar zxvf sshpass-1.05.tar.gz && cd sshpass-1.05 && ./configure &&
make && sudo make install

一个我的测试环境的例子, 我加注释说明

host: 192.168.3.11 #测试服务器, 格式是user@host:port
password: dongwmspassword #登录服务器需要的密码
gateway: #可以不存在,中间服务器,格式是user@host:port
gatewaypassword: #中间服务器(jump跳板机)的密码
rsync: #这个操作是rsync
  lpath: $ROOT #你可以使用全路径, $ROOT表示当前路径,本地目录
  rpath: /opt/tornado # 测试环境的目录
services: # 每个段落就是一个服务,这里有nginx和supervisor
  nginx:
    command: kill -9 `ps -ef |grep nginx|grep -v grep|awk '{print $2}'` && /opt/nginx/sbin/nginx #启动的命令
    lpath: /usr/local/etc/nginx/nginx.conf #nginx.conf的本地地址
    priority: 1 #优先级越高越先执行
    rpath: /opt/nginx/conf/nginx.conf #测试环境的nginx.conf路径
    sudo: false # 因为这个环境很宽松 不需要sudo
    user: #sudo使用的用户,默认是登陆的用户
  supervisor:
    command: supervisorctl -c /etc/supervisor/supervisord.conf reload
    lpath: /Users/dongwm/settings/supervisord.conf.31
    priority: 2
    rpath: /etc/supervisor/supervisord.conf
    sudo: false
    user:
username: root #登陆服务器的默认用户, 你可以在使用host的时候指定用户

欢迎给我issue和PR

后文

    因为很多人会用到跳板机,我想加入跳板机的用法, 看起来就像直接在本地操作远程一样
    设置输出是否隐藏,目前保留就是为了让我看到执行的过程
    设置支持多测试环境一起部署,或者说让生成环境的部署一样方便

下面来看一个关于PHP调用Linux命令无权限的问题解决(visudo),希望文章对大家有帮助.

业务背景:  yourcmd为我的linux程序,它对权限要求非常严格,当用php去执行yourcmd程序

系统:CentOS 6.3

apache是php的执行用户

用exec函数去执行linux系统上的程序/usr/local/yourcmd/sbin/yourcmd

php代码如下


<?php
$conf_file = "/var/www/html/webroot/test.tmp";
$command = "sudo /usr/local/yourcmd/sbin/yourcmd -t -f {$conf_file}";
exec($command,$out);
print_r($out);

测试结果为没有权限

Array ( [0] => sudo: no tty present and no askpass program specified )
解决步骤:

 

$ visudo

1)注释以下行


#Defaults    requiretty

2)在文件末尾加入以下

apache ALL=(ALL) NOPASSWD: ALL
Cmnd_Alias yourcmd = /usr/local/yourcmd/sbin/yourcmd


最后测试结果


Array ( [0] => Warning: memory is too small: 1044725760 [1] => test configure is ok )

最近发现一个奇怪的事件,刚编辑好的php文件上传到Linux服务器上,然后下载后就发现代码在一行,换行符丢失了,找了好久才找到解决办法,分享如下。

在使用ftp软件上传下载php源文件时,我们偶尔会发现在本地windows下notepad++编辑器写好的php文件,在使用ftp上传到linux服务器后,php文件的换行符全部丢失了,导致php文件无法正常运行。

这个时候,再次通过ftp软件把刚才上传的php文件下载到本地windows,用notepad++编辑器打开后,发现php源代码变成了一行,换行丢失。

发生这种情况的原因是什么呢?飘易就以一句话概括下:

由于linux下换行是n,而windows下换行是rn,当ftp软件在上传时,默认是以ASCII方式上传的,而ASCII方式上传文件有个特点,会将文件里的换行符进行适当处理以符合上传服务器的运行环境。在这个过程中,部分文件就会处理不当,出现换行符丢失的bug。(注意,不是全部php文件,是小部分的php文件会出现这个问题)。

上诉问题尤其在php源码里有单行注释符“//”时,会导致php源文件直接无法运行。因为源码变成了一行代码后,单行注释符把//后面所有的代码都注释掉了。

FTP上传bug解决方法:

方法1: 将单行注释符 // 改成 多行注释符 /* 注释文字 */ 这样即使换行符丢失,也不影响后面源码的执行。(但是下载到本地二次修改时,依然是件头疼的事!)
方法2: FTP上传php文件不要使用ASCII模式,全部使用二进制方式。这是最保险的。 如何设置ftp软件以二进制方式Binary上传,请网络搜索下自己使用的ftp软件的设置方式。


【知识补充:FTP的ASCII和Binary传输模式】 :

FTP有ASCII和Binary两种传输模式:
Binary模式不会对数据进行任何处理。
Ascii模式会将回车换行转换为本机的回车字符。
 
由于WINDOWS和UNIX的行结束符不一样。所以从WINDOWS用Binary传输方式传输文本文件到UNIX时可能会出现^M。同样从UNIX用Binary方式传输文件到WINDOWS时,也可能出现回车换行显示不正确的问题。
 
WINDOWS下新建ftp_ascii.txt内容如下:
hello word!
WINDOWD TO UNIX !
TEST FTP ASCII;

我们分别用两种模式上传到UNIX.
ASCII模式正常
vi ftp_ascii.txt
hello word!
WINDOWD TO UNIX !
TEST FTP ASCII;

二进制模式 Binary有问题

vi ftp_ascii.txt
hello word!^M
WINDOWD TO UNIX !^M
TEST FTP Binary;

由此可知我们采用ASCII模式传输文本可以避免传输中的^M问题。 FTP中虽然ASCII模式可以避免^M的问题。但大多数情况还是选择Binary方式,这样可以保证传输的内容不会被改变。尤其是在传输可执行文件如php源码时, 大多选用binary方式。

在FlashFXP中可以在菜单->会话->传输模式中 选择ASCII ,BINARY ,自动三种模式。

另外,我们以ssh登录sftp的方式上传文件时,也可以避免换行丢失的问题。

preg_match_all是执行一个全局正则表达式匹配函数,今天在win2003使用preg_match_all居然导致apache崩溃,下面是解决办法。

平台是windows server 2003(32位系统) + Apache/2.2.9 (Win32) + PHP/5.2.17,在使用正则表达式 preg_match_all (如 preg_match_all("/ni(.*?)wo/", $html, $matches);)进行分析匹配比较长的字符串 $html 时(大于10万字节,一般用于分析采集回来的网页源码),Apache服务器会崩溃自动重启。

在Apache错误日志里有这样的提示:

[Thu Apr 11 18:31:31 2013] [notice] Parent: child process exited with status 128 -- Restarting.
[Thu Apr 11 18:31:31 2013] [notice] Apache/2.2.9 (Win32) PHP/5.2.17 configured -- resuming normal operations
[Thu Apr 11 18:31:31 2013] [notice] Server built: Jun 13 2008 04:04:59
[Thu Apr 11 18:31:31 2013] [notice] Parent: Created child process 2964
[Thu Apr 11 18:31:31 2013] [notice] Disabled use of AcceptEx() WinSock2 API
[Thu Apr 11 18:31:31 2013] [notice] Child 2964: Child process is running
[Thu Apr 11 18:31:31 2013] [notice] Child 2964: Acquired the start mutex.
[Thu Apr 11 18:31:31 2013] [notice] Child 2964: Starting 350 worker threads.
[Thu Apr 11 18:31:31 2013] [notice] Child 2964: Listening on port 80.

经过查阅Apache官方以及论坛资料后,发现win平台下用正则 preg_match_all 或preg_match 分析比较长的字符串时,导致apache崩溃重启的原因是windows平台下默认分配的线程堆栈空间 ThreadStackSize 太小导致的。 win32默认只有256KB,而在 linux下默认值是 8M,这就是为什么同样的程序在 linux平台下正常,而在 win平台下不正常的原因。

根据PCRE library的官方说明:256 KB 的堆栈空间对应的pcre.recursion_limit大小应该不超过524。
Here is a table of safe values of pcre.recursion_limit for a variety of executable stack sizes:
下面就是一张Stacksize和pcre.recursion_limit对应的建议安全值,超过这个数值就极有可能发生堆栈溢出,apache crash:
Stacksize   pcre.recursion_limit
 64 MB      134217
 32 MB      67108
 16 MB      33554
  8 MB      16777
  4 MB      8388
  2 MB      4194
  1 MB      2097
512 KB      1048
256 KB      524

如果你没有调整堆栈大小,就必须在使用正则的PHP页面最开头加入:

<?php
ini_set("pcre.recursion_limit", "524"); // PHP default is 100,000.
?>

查看具体的错误可以使用下面的代码:

$resultsArray = preg_match_all("/table.*?<a>/isU", $html, $contents);
if ($resultsArray === 0){
echo get_pcre_err();
}
function get_pcre_err(){
        $pcre_err = preg_last_error();  // PHP 5.2 and above.
        if ($pcre_err === PREG_NO_ERROR) {
            $msg = 'Successful non-match.';
        } else {
            // preg_match error!
            switch ($pcre_err) {
                case PREG_INTERNAL_ERROR:
                    $msg = 'PREG_INTERNAL_ERROR';
                    break;
                case PREG_BACKTRACK_LIMIT_ERROR:
                    $msg = 'PREG_BACKTRACK_LIMIT_ERROR';
                    break;
                case PREG_RECURSION_LIMIT_ERROR:
                    $msg = 'PREG_RECURSION_LIMIT_ERROR';
                    break;
                case PREG_BAD_UTF8_ERROR:
                    $msg = 'PREG_BAD_UTF8_ERROR';
                    break;
                case PREG_BAD_UTF8_OFFSET_ERROR:
                    $msg = 'PREG_BAD_UTF8_OFFSET_ERROR';
                    break;
                default:
                    $msg = 'Unrecognized PREG error';
                    break;
            }
        }
    return($msg);
}

对于正则的修饰符 isU 说明:

i: 表示in-casesensitive,即大小写不敏感
s: PCRE_DOTALL,表示点号可以匹配换行符。
U: 表示PCRE_UNGREEDY,表示非贪婪,相当于perl/python语言的.*?,在匹配过程中,对于.*正则,一有匹配立即执行,而不是等.*搜索了所有字符再一一返回

在使用正则表达式时,我们应该尽量避免递归调用,递归容易导致堆栈溢出。比如:

/<table((?!<table).)*?</a>/isU 就会发生错误,而使用 /<table.*?</a>/i 就正常。


那么如何增加win平台下 ThreadStackSize 的大小呢? 在apache的配置文件 httpd.conf 里启用 “Include conf/extra/httpd-mpm.conf”(删除前面的注释#),然后在 httpd-mpm.conf 文件里的 mpm_winnt_module 配置模块里设置 “ThreadStackSize 8400000”即可(大约8M)。

<IfModule mpm_winnt_module>
    ThreadStackSize 8400000
    ThreadsPerChild      200
    MaxRequestsPerChild    10000
    Win32DisableAcceptEx
</IfModule>

这里需要注意的是,32位的Apache程序只能最多使用大约2GB内存空间! 因此,ThreadStackSize 和ThreadsPerChild 的值相乘后(8M * 200)不应该超过2G,否则无法启动apache,出现的错误日志如下:

[Thu Apr 11 20:02:45 2013] [crit] (OS 8)存储空间不足,无法处理此命令。  : Child 4832: _beginthreadex failed. Unable to create all worker threads. Created 212 of the 220 threads requested with the ThreadsPerChild configuration directive.

通过上面的提示,飘易可以告诉大家的是在我的这台服务器上,当线程堆栈大小设为8M时,我可以设置的线程数最多是212个。

[!--infotagslink--]

相关文章

  • mysql_connect与mysql_pconnect的区别详解

    在mysql中我们会看到有两种常用的数据库连接模式,一种是长久连接,另一各是页面访问完之后就断了连接,下面我来分别介绍mysql_connect与mysql_pconnect的区别,有需要了解...2016-11-25
  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • php cURL https链接报错:Unknown SSL protocol error in connection to

    cURL在php中用到的比较多了我们通常把它用于采集访问或数据模拟提交上了,但在用到https时我们使用常用的办法会提示报错:Unknown SSL protocol error in connection to...2016-11-25
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • C#中加载dll并调用其函数的实现方法

    下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25