使用远程文件
大家知道我们可以通过include、require等方法引用本地的其他文件,如果给它们传递一个远程文件的url,也是可以引用的,只要在php.ini中激活allow_url_fopen选项。
栗子:
$file = fopen ("http://www.example.com/", "r”); //以读的方式打开远程文件
$line = fgets ($file, 1024);//读取文件内容
fclose($file); //释放文件句柄
如果有合法的访问权限,以一个用户的身份和某 FTP 服务器建立了链接,还可以向该 FTP 服务器端的文件进行写操作。只能用该方法来创建新的文件,如果尝试覆盖已经存在的文件,fopen() 函数的调用将会失败,栗子:
$file = fopen ("ftp://ftp.example.com/incoming/outputfile", "w”); //以写的方式打开远程文件
fwrite ($file, $_SERVER['HTTP_USER_AGENT'] . "\n”);//向文件中写数据。
连接处理
在php内部,系统维护着连接状态,这个连接指的是远程客户端和本地服务器的连接,有三种情况: 0-NORMAL(正常),1-(ABORTED)异常退出,2-TIMEOUT超时。当php脚本运行状态为NORMAL时,连接是有效的,当远程客户端终中断连接时ABORTED标记被打开,当连接时间超过PHP的时限(时限通过set_time_limit()函数设置)时,TIMEOUT被打开。
默认情况下,远程客户端中断连接时php脚本自动退出,这个处理过程可以通过php.ini 的 ignore_user_abort选项 或由 httpd.conf 设置中对应的“php_value ignore_user_abort”以及 ignore_user_abort() 函数来控制。如果想在客户端中断连接的情况下继续执行脚本,可以通过 register_shutdown_function() 设置关闭触发函数。这个关闭触发函数表示:当远程客户端中断连接后,脚本再次尝试输出数据时,PHP 将会检测到连接已被中断,并调用关闭触发函数。
脚本也有可能被内置的脚本计时器中断。默认的超时限制为 30 秒。这个值可以通过设置 php.ini 的 max_execution_time 或 httpd.conf 设置中对应的“php_value max_execution_time”参数或者 set_time_limit() 函数来更改。当计数器超时的时候,脚本将会类似于以上连接中断的情况退出,先前被注册过的关闭触发函数也将在这时被执行。 ABORTED 和 TIMEOUT 状态可以同时被打开,当PHP 忽略用户的退出操作时,用户中断了连接,脚本继续执行,但是超过了max_execution_time,超时脚本自动退出,设置过的关闭触发函数也将被执行。
数据库持久连接
持久连接是指在脚本结束运行时不关闭的连接,当收到一个持久连接的请求时,PHP 将检查是否已经存在一个相同(前面已经开启的、相同用户名和密码)的持久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接,持久连接并不提供任何附加的功能,它和非持久连接的区别只是脚本结束时释放不释放连接而已,前提是在脚本中没有手动调用关闭连接的函数,因为一旦调用关闭连接的函数,不管是否是持久连接都会释放连接的。
使用持久连接的好处:提高效率。web服务器创建到数据库的连接其实是很耗时的,特别是一个web服务器需要访问多种数据库、数据库分布在一个集群上的时候,使用持久连接可以在每个子进程的声明周期中只有一次连接数据库操作,而不是每次执行一个sql时都要重新发起一次连接。如果持久连接的子进程数目超过了设定的数据库连接数限制,系统将会产生一些问题。栗子:如果数据库的同时连接数限制为 16,有 17 个线程试图连接,那么有一个线程将无法连接。如果这个时候,在脚本中出现了使得连接无法关闭的错误(例如无限循环),则该数据库的 16 个连接将迅速地受到影响。
在使用持久连接时还有一些其他问题需要注意,如果在持久连接中使用数据表锁,脚本不知道什么原因被异常退出了,这个时候连接没有释放,那么后面的进程再使用相同连接时也不能向这个数据表写数据了,这时候只能重启httpd服务或数据库服务。另外,在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本。不管在什么情况下,都可以通过使用 register_shutdown_function() 函数来注册一个简单的清理函数来打开数据表锁,或者回滚事务。