Category Archives: Apache

理解PHP中Mysql的永久连接

参考自这里 PHP程序员应该都知道连接MySQL数据库可以使用mysql_pconnect(永久连接)函数,使用数据库永久连接可以提高效率,但是实际应用中数据库永久连接往往会导致出现一些问题,通常的表现就是在大访问量的网站上时常发生断断续续的无法连接数据库的情况,出现类似"Too many connections in ..."的错误提示信息,重新启动服务器又正常了,但过不了一会儿又出现同样的故障。对于这些问题的成因,恐怕就不是每个人都能说清楚的了,虽然PHP文档里有一些相关资料,但是解释的并不浅显易懂,这里我厚着脸皮试图做一个简单的讨论,所述观点不见得全都正确,欢迎大家反馈意见。 首先看看数据库永久连接的定义: 永久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。 PHP使用永久连接方式操作MySQL是有前提的:就是PHP必须安装为多线程或多进程Web服务器的插件或模块。最常见的形式是把PHP用作多进程Apache服务器的一个模块。对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成Web页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个永久连接后,所有不同子进程请求SQL服务的后继页面都能够重新使用这个已经建立的 SQL服务器连接。它使得每个子进程在其生命周期中只做一次连接操作,而非每次在处理一个页面时都要向 SQL 服务器提出连接请求。每个子进程将对服务器建立各自独立的永久连接。PHP本身并没有数据库连接池的概念,但是Apache有进程池的概念, 一个Apache子进程结束后会被放回进程池, 这也就使得用mysql_pconnect打开的的那个mysql连接资源可以不被释放,而是依附在相应的Apache子进程上保存到了进程池中。于是在下一个连接请求时它就可以被复用。一切看起来似乎都很正常,但是在Apache并发访问量大的时候,如果使用mysql_pconnect,会由于之前的Apache子进程占用的MySQL连接没有close, 很快使MySQL达到最大连接数,使得之后的请求可能得不到响应。 上面的部分文字是摘抄自PHP文档,看起来可能还是有些文绉绉的不好理解,那么我就用大白话再举一个例子来说明问题: 假设Apache配置最大连接数为1000,MySQL配置最大连接数为100,当Apache服务器接到200个并发访问的时候,其中100个涉及到数据库访问,剩下的100个不涉及数据库访问,因为这个时候还不存在可用的数据库连接,所以这里面涉及到数据库访问的100个并发会同时产生100个数据库永久连接,达到了数据库最大连接数,当这些操作没有结束的时候,任何其他的连接都无法再获得数据库连接,当这些操作结束了,相应的连接会被放入进程池,此时Apache的进程池里就有了200个空闲的子进程,其中100个是带有数据库连接的,由于Apache会为访问请求随机的挑选空闲子进程,所以你得到的子进程很可能是不包含数据库连接的那100个中的一个,而数据库连接已经达到了最大值,你也不可能成功的建立新的数据库连接,唉,你便只好不停的刷新页面,哪个时候运气好,碰巧分配到了带有数据库连接的子进程,才能正常浏览页面。如果是大访问量的网站来说,任何时候都可能存在大量的并发,所以浏览者可能就会不停的发现无法连接数据库的现象了。 或许你会说,我们把Apache和MySQL的最大连接数调成一样大不就可以了么?是的,合理的调整这个最大连接数某种程度上会避免这个问题的发生,但是Apache和MySQL的负载能力是不同的,如果按照Apache的负载能力来设置,对于MySQL来说,这个最大连接数就偏大,会产生大量的MySQL数据库永久连接,打个比方,就好像和平时代还要养活一个几百万的军队一样,其开销得不偿失;而如果按照Mysql的负载能力设置,对于Apache来说,这个最大连接数就偏小,有点杀鸡牛刀的感觉,无法发挥Apache的最大效率。 所以按照PHP手册上的介绍,只适合在并发访问不大的网站上使用数据库永久连接,但对于一个并发访问不大的网站来说,使用数据库永久连接带来的效率提高似乎没有太大的意义,从这个角度上来看,我觉得PHP中的数据库永久连接基本上是一个鸡肋的角色,如果你一定要使用数据库连接池的概念,可以尝试一下sqlrelay或者Apache本身提供的mod_dbd,说不定会有惊喜。
Also posted in Mysql, PHP | Tagged , | Leave a comment

Web-Server 中 PHP 的两种工作方式

部分内容参考自这里, 这里 在项目生产环境的 Web-Server 中 PHP.exe 通常以两种工作方式工作, 一种是 Apache 中的模块化方式, 另一种是在 Nginx 中的 FastCGI 方式. 除此之外, PHP.exe 还有一种古老的运行方式: CGI 方式, 这种方式基本上已经被淘汰, 我们可以通过 CGI 方式来很好的理解前两种方式. CGI 方式是: #当 Web-Server 启动时: 1, Web-Server 只初始化自身. #web 请求处理过程是: 1, 用户(浏览器)发起一个 *.php 文件的请求给 Web-Server 2, Web-Server 调用 php.exe 3, php.exe 完成一系列的初始化动作(如: 解析 php.ini , 载入全部扩展, ...) 4, php.exe 初始化完成, 解释 [...]
Also posted in PHP | Tagged , , | Leave a comment

开启SVN-Server上的密码认证功能

之前介绍的《Windows 下安装 SVN-Server》, 在安装好 SVN-Server 后可以不需要用户名和密码直接对版本库进行检出/更新/提交等操作, 这样在安全性方面很差, 现在将介绍怎么样在基于 http 协议的 SVN-Server 上添加密码认证功能. 首先假设现在已经存在一个版本库game, 它在 svn_server 上存放的路径是: E:\svn_server\game 客户端 checkout 的地址是: http://localhost/svn/game 我们需要给这个版本库加上用户名密码认证功能. 1, 首先在 E:\svn_server\game\conf\ 目录中新建一个名为 passwd.win 的空文件, 它将记录我们要认证的用户名和密码. 2, 假设我们 Apache 的安装目录是 D:\Program Files\EasyPHP-5.3.2i\apache\ , 我们输入命令生成一个用户名为 admin , 密码是 123456 的帐号 cmd D: cd D:\Program Files\EasyPHP-5.3.2i\apache\bin htpasswd -bm E:\svn_server\game\conf\passwd.win admin 123456 3, 修改 E:\svn_server\game\conf\authz [...]
Also posted in Tool | Tagged | Leave a comment

Windows 下安装 SVN-Server

1, 下载 svn 服务器端程序 http://ncu.dl.sourceforge.net/project/win32svn/1.6.16/svn-win32-1.6.16.zip 2, 解压, 将 svn-win32-1.6.16 目录复制到 D:\Program Files\svn-win32-1.6.16 3, 复制文件 //复制下面两个文件 D:\Program Files\svn-win32-1.6.16\bin\mod_authz_svn.so D:\Program Files\svn-win32-1.6.16\bin\mod_dav_svn.so //粘贴到 Apache 扩展目录中去 D:\Program Files\EasyPHP-5.3.2i\apache\modules 4, 将 D:\Program Files\svn-win32-1.6.16\bin 添加到系统环境变量 Path 中去 5, 编辑 Apache 配置文件 httpd.conf //查找下面两行,去掉前面的#号 #LoadModule dav_module modules/mod_dav.so #LoadModule dav_fs_module modules/mod_dav_fs.so //再在后面添加两行 LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so 6, 重启电脑 7, 建立 SVN-Server [...]
Posted in Apache | Tagged , | Leave a comment

常用Apache设置

● Listen 服务器监听IP地址和端口。 Listen参数是指Apache服务器在指定的IP地址和端口上进行监听;默认情况下Apache会在所有IP地址上监听。Listen是一个必须设置的指令。如果在配置文件中找不到这个指令,服务器将无法启动。 Listen参数还可以指定服务器在哪个端口或地址和端口的组合上进行监听请求。如果只指定一个端口,服务器将在所有地址上监听该端口。如果指定了地址和端口的组合,服务器将按照指定地址和指定的端口进行监听。 使用多个Listen参数可以指定多个不同的监听端口和/或地址端口组合。 例如,想要服务器接受80和8080端口上的请求,可以这样设置: Listen 80 Listen 8080 为了让服务器在两个确定的地址端口组合上接受请求,可以这样设置: Listen 192.64.182.1:80 Listen 192.64.182.5:8080 注意:多个Listen指令指定了同一个地址和端口的组合后,会导致"Address already in use"错误。 ● ServerRoot 服务器的安装基础目录。 该参数设置了服务器所在的目录。一般来说它将包含conf/和logs/子目录。其它配置文件的相对路径都基于此目录 (比如Include或LoadModule)。 例如: ServerRoot /etc/httpd ● DocumentRoot 组成网络上可见的主文档树的根目录。 此参数设置了httpd服务的目录。在没有配置类似Alias这种参数的情况下,服务器会将请求中的URL附加到DocumentRoot后面以构成指向文档的路径。 比如说: DocumentRoot /etc/httpd/www/web 于是对http://www.ccb.com.cn/index.html的访问就会指向/etc/httpd/www/web/index.html。如果参数中不是绝对路径,则被假定为是相对于ServerRoot的路径。 注意:指定DocumentRoot时不应包括最后的"/"。 ● Directory 可以封装一组参数,使之仅对文件空间中的某个目录及其子目录生效 <Directory directory-path> ... </Directory> <Directory>和</Directory>用于封装一组参数,使其对某个目录及其子目录生效。directory-path可以是一个目录的完整路径,或是包含了Unix shell匹配语法的通配符字符串,但是通配符都不能匹配"/"字符,例如:<Directory /*/public_html>是无法匹配/home/user/public_html 的,而<Directory /home/*/public_html>却能够正确匹配。 directory-path参数必须与被访问文件所在文件系统的路径保持一致。如果有多个非正则表达式,<Directory>配置段符合并包含某文档的目录(或其父目录),那么会以短目录优先的规则进行应用。<Directory />的默认访问权限为"Allow from All",这意味着Apache没有进行访问控制,通过设置Order,Deny,Allow,AllowOverride这个几个参数可以对访问进行控制。 下面简单介绍一下这4个参数的用法。 ▲ [...]
Posted in Apache | Tagged , | Leave a comment

微博缩短网址的实现

原文在这里 随着类似Twitter的微型博客网站的出现,由于字符数的限制,网址缩短服务日渐增多。加上网址缩短服务提供商提供网址追踪等服务,这一业务日渐兴起。知名网址缩短服务商Bit.ly的主要业务便是为微博Twitter提供网址缩短服务。 比如sina微博的sinaurl.cn,腾讯微博的url.cn等。 实现原理很简单,主要是将用户提交的 url 地址转化成一个唯一的字串,这个字串就对应着真实的 url,怎么样实现这种转换呢? url 的转换摘自:http://www.cnblogs.com/sunli/archive/2010/03/25/1696183.html 数据库只有两个字段seq(自增长数字)和url(数字的url地址,建立索引)。 用户输入一个url地址,查询表是否包含此url,如果存在,则返回seq的数字, 如果不存在,则插入数据库,得到一个新增加的自增seq数字,为了缩短数字占用的字符数,我们可以把abc等字母的大小写用上。这样10个数字,26个小写字母,26个大小字母就组成了一个62进制了。比如数字10000000000(100亿)转换后就是aUKYOA,只有6位了,这样就能缩短很多的网址了。 <?php //十进制转到其他制 function dec2any( $num, $base=62, $index=false ) { if (! $base ) { $base = strlen( $index ); } else if (! $index ) { $index = substr( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,0 ,$base ); } $out = ""; for ( $t = floor( log10( [...]
Also posted in Linux, PHP, shell | Tagged , | Leave a comment

让 Apache 支持 mod_python

mod_pytho 中文文档 http://man.chinaunix.net/develop/python/mod_python/mod_python.html 1, 下载 ModPython-3.3.1 (http://www.apache.org/dist/httpd/modpython/win/3.3.1/), 安装, 安装过程中会讯问 apache 安装目录. 2, 在apache的httpd.conf中加入下面一行: LoadModule python_module modules/mod_python.so 3, 再加入下面一段 Alias /py/ "d:/PythonCode/" <Directory "d:/PythonCode/"> AddHandler mod_python .py #PythonHandler mptest PythonHandler mod_python.publisher PythonDebug On </Directory> 4, 在 d:/PythonCode/ 目录下新建一名为 mptest.py 的测试文件,内容如下 from mod_python import apache def handler(req): req.content_type = "text/plain" req.write("Hello World!") return apache.OK 5, 通过 http://127.0.0.1/py/mptest.py [...]
Also posted in Python | Tagged , | Leave a comment

设置 Apache & hosts 本地开发环境

设置本地 Apache 虚拟主机 & 本地 hosts 打造和外网虚拟空间一模一样本地开发环境. Apache 是全球而署最多的 web server 想全面了解它可以访问官方主页 http://www.apache.org/ Hosts文件是一个用于存储计算机网络中节点信息的文件,它可以将主机名映射到相应的IP地址,实现DNS的功能,它可以由计算机的用户进行控制。 Windows 中它的存放位置是: c:\windows\system32\drivers\etc\hosts Linux 中它的存放位置是: /etc/hosts 如果你有自己的网站, 但没有自己的本地开发环境, 你想新增一个新功能, 你的操作步骤可能是这样子的: 1, 在本地(本机)把新功能开发好 2, 然后用ftp上传到自己的外网虚拟主机网站目录下 3, 在外网虚拟机空间上测试功能是否正常 4, 如果正常,OK.完成 / 但如果有错, 执行以下步骤: 5, 再修改 6, 再上传 7, 再调试 8, ... <-- 不断循环(4/5/6/7)步骤, 直到功能能正常使用. 显然这样子是费神又费力的, 而且更大的弊端是访问你的网站的用户会有可能看到你调试时的错误信息(如果你的网站有注册用户, 在你调试时十分不凑巧的被他们访问到了你的新功能而引起数据库上错误, 那麻烦就大了) 显然打造本地开发环境是十分有必要的. 前期准备工作: 在本地安装好 Apache+php+mysql , [...]
Posted in Apache | Tagged , | Leave a comment