标签 PHP 下的文章

首先PHP没有自带定时器(例如每隔几秒自动执行一下某函数)。要实现这个功能,只有三个方法:1)利用外部脚本实现定时执行;2)利用客户端的JavaScript定时执行;3)根据访问请求来实现,但前提是网站的访问量足够大。利用外部脚本实现定时执行,只能是使用虚拟主机或者自己架设服务器才能使用(在虚拟空间上运行,就只能考虑使用JavaScript)。

网上搜到的资料,用PHP页面也可以实现定时器的。主要思路是使用死循环,再加延时执行(即sleep或者usleep函数)。相关示例代码如下:

//------------begin file: timer.php------------
<?php
//每半秒执行记录一下当前时间

//写文件函数
function write_txt() {
    $filePath = 'timer_test.txt';
    if(!file_exists($filePath)){
        $fp = fopen($filePath, 'ab');
        fclose($fp);
    }
    $str = "\r\n" . date('Y-m-d H:i:s');
    $fp = fopen($filePath, 'ab'); //a为打开文件后指向文件末尾,b为以二进制打开文件
    fwrite($fp, $str);
    fclose($fp);
}

ignore_user_abort(); //即使关掉浏览器,PHP也可继续执行
set_time_limit(0); //不设置脚本超时时间,可以无限执行下去
$interval = 30; //时间间隔为30秒
do{
    //定时执行的代码
    write_txt();
    sleep($interval); //等待,sleep的参数单位是秒,usleep的参数单位是毫秒
}while(true); //死循环
//------------end file: timer.php------------

执行时还有个问题,用浏览器打开运行后,网站的其它连接都卡住且不能打开。网上搜到的解析是,PHP不支持多线程。最后只有在服务器上,用以下命令运行:

php timer.php &

今天很郁闷!做了个PHP页面,Chrome显示正常,IE显示却不正常。本来骂IE、骂微软是正常不过的了,但不是骂完就能解决问题的。

Google的答案是UTF-8的BOM问题。BOM(Byte Order Mark),即UTF-8签名(UTF-8 signature),是UTF编码方案里用于标识编码的标准标记。简单来说,PHP编译代码时,没有理会BOM,造成IE显示错误。也由于使用了CodeIgniter框架,即使改了View页面,也解决不了问题,最后修改了相关的文件,即系Route、Controller、Model等相关页面。简单来说,用UTF-8编码写PHP,就要统一使用无BOM的UTF-8。

感觉每次用新的东西都会这样那样的小问题。其实都是因为基于已有的经验来做,比如因为用Java而使用UTF-8。