php 异步执行脚本

最近有个地方需要拉起一个脚本处理任务,起了进程交给init进程发现还是会阻塞,后来找到这篇文章,发现原来自己想的太复杂。至于为什么web里不让用nohup,还不知道原因。

这里说的异步执行是让php脚本在后台挂起一个执行具体操作的脚本,主脚本退出后,挂起的脚本还能继续执行。比如执行某些耗时操作或可以并行执行的操作,可以采用php异步执行的方式。主脚本和子脚本的通讯可以采用外部文件或memcached的方式。原理就是通过exec或system来执行一个外部命令。注意:本文所述的是针对Linux环境。

在Linux下要让一个脚本挂在后台执行可以在命令的结尾加上一个 “&” 符号,有时候这还不够,需要借助nohup命令,关于nohup,可以参考http://www.netingcn.com/linux-nohup.html

CLI环境和Web环境执行的操作还不太一样。先来说CLI环境,这里需要用上nohup和&,同时还要把指定输出,如果不想要输出结果,可以把输出定向到/dev/null中。现在来做一个测试,假设在一个目录中有main.php、sub1.php和sub2.php,其中sub1和sub2内容一样都让sleep函数暂停一段时间。代码如下:

上述文件中main.php是作为主脚本,在命令行中执行php main.php,可以看到main.php脚本很快就执行完并退出。在使用ps aux | grep sub命令搜索进程,应该可以在后台看到上述的两个子脚本,说明成功挂起了子脚本。

在Web环境下,执行php脚本都是Web服务器开启的cgi进程来处理,只要脚本不退出,就会一直占有该cgi进程,当启动的所有cgi进程都被占用完后就不能在处理新的请求。所以对那些可能会很费时的脚本,可以采用异步的方式。启动子脚本的方式和CLI差不多,必须要使用&和指定输出(只好是定向到/dev/null),但是不能使用nohup。例如:

当在浏览器中访问该脚本文件,可以看到浏览器里面响应完成,同时使用ps命令查看后台可以看到sub1和sub2脚本。

注意上述例子中如果php命令不在PATH中,需要指定命令完整的路径。推荐使用完整路径,特别是在Web下。

转自 http://www.netingcn.com/php-asynchronous-execute-script.html

mysq使用like查找有反斜杠的数据

不知道什么时候记录的这条了,一直也没发布。

这里的重点是使用like binary,而且使用了四个反斜线。

具体可以参考下面的地址:

http://stackoverflow.com/questions/8583144/mysql-like-operator-with-wildcard-and-backslash

wordpress禁用Google Open Sans字体

这两天打开博客发现十分慢,看了一下网络请求,发现多了一个google样式

搜了一下发现wordpress3.8开始就使用这个google开放字体了,由于google的网络因为一些原因访问异常,所以我们只能想办法禁用掉了。

可以使用【Disable Google Fonts】这个插件禁用这个样式。

PHP autoload和spl_autoload自动加载机制详解 [转]

PHP autoload机制详解

(1) autoload机制概述

在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这 也是OO设计的基本思想之一。在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可。下面是一个实际的例 子:

在这个例子中,no-autoload.php文件需要使用Person类,它使用了require_once将其包含,然后就可以直接使用Person类来实例化一个对象。

但 随着项目规模的不断扩大,使用这种方式会带来一些隐含的问题:如果一个PHP文件需要使用很多其它类,那么就需要很多的require/include语 句,这样有可能会造成遗漏或者包含进不必要的类文件。如果大量的文件都需要使用其它的类,那么要保证每个文件都包含正确的类文件肯定是一个噩梦。

PHP5为这个问题提供了一个解决方案,这就是类的自动装载(autoload)机制。autoload机制可以使得PHP程序有可能在使用类时才自动包含类文件,而不是一开始就将所有的类文件include进来,这种机制也称为lazyloading。 下面是使用autoload机制加载Person类的例子:

通常PHP5在使用一个类时,如果发现这个类没有加载,就会自动运行__autoload()函数,在这个函数中我们可以加载需要使用的类。在我们这个简 单的例子中,我们直接将类名加上扩展名" title="扩展名">扩展名”.class.php”构成了类文件名,然后使用require_once将其加载。

从这个例子中,我们可以看出 autoload至少要做三件事情,第一件事是根据类名确定类文件名,第二件事是确定类文件所在的磁盘路径(在我们的例子是最简单的情况,类与调用它们的 PHP程序文件在同一个文件夹下),第三件事是将类从磁盘文件中加载到系统中。第三步最简单,只需要使用include/require即可。要实现第一 步,第二步的功能,必须在开发时约定类名与磁盘文件的映射方法,只有这样我们才能根据类名找到它对应的磁盘文件。 继续阅读

python2.7 libpython2.7.so.1.0载入问题

今天使用scons的时候遇到下面一个错误:

/home/vincent/bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

google了一下,按照上面的方法执行了如下语句:

export LD_LIBRARY_PATH=/home/vincent/lib/python

python倒是能正常用了,但是奇怪的是跑了scons还是报上面的错误!

继续google,找了找规律,发现大家都增加了这个选项:

--enable-shared

去掉这个选项重新编译(别忘了make clean),python又能用了(本地python版本为2.7.6)。

此方法只适合不需要这个选项的情况,如果有人知道怎么回事,希望能够指出。

杂事二三

春暖花开,小区后面的林荫小径口又架起烧烤摊,若是回家很晚还能看到两夫妻熟悉的脸孔,只是曾每晚必到的流浪小白猫已无踪影,或是凡世再无牵挂,或是已死了心吧。

emacs使用ELPA管理扩展

平时我们使用emacs的时候都是自己去找扩展,然后找各种依赖进行安装,这个很麻烦,emacs 24以后完全可以在emacs内部直接安装。emacs从24开始内置支持ELPA(Emacs Lisp Package Archive),支持emacs使用package.el管理扩展。

我们在.emacs里面增加安装源:

然后我们使用 M-x 初始化一下包环境:

更新包的索引:

获取想要的包:

emacs 23也是可以用的,不过需要增加一个初始化的脚本。

细节可以参考:http://www.emacswiki.org/emacs/ELPA

禁用emacs的工具栏

osx下使用emacs的时候,如果使用了--with-ns选项,会nextstep目录下生成一个Emacs的app文件,我的是24.3.2,用起来还不错,至少是可以全屏的。

也许有人想要关闭上面的工具栏,如果像一些模式一样在.emacs里面写上:

但是其实这个是不会生效的。

查看一下源码发现选项是1和0,所以我们只需要写成如下方式:

但是如果同时还想使用命令行的emacs,会发现cli下是没有tool-bar-mode的,所以需要判断一下window-system:

这样就可以安心的禁用工具栏了。

深夜牢骚

沿着太阳升起的方向,我想我总会找到,那个希望蓬勃的地方。

赤着脚走,一片黑暗的沼泽,枯死的树干和肮脏的污水。昨天的昨天,我还在尖塔的某个房间躲避风雨,那里的温暖令人不安。我走出来,离开那里,离开那些怀着善意的人。如今独自一人,到这阴暗潮湿冰冷的地方,越过被黑暗吞没的灵魂和道旁腐朽的骸骨。

一片金黄的麦田,沿着中间狭窄的小路前进,金黄的阳光,照亮金黄色的天空。我欣喜的向前,到达那一直通向天空深处的藤蔓,那没有尽头的藤蔓……我看到奋力向上攀爬的人们,他们的汗水化作雨点坠落。我努力追逐,希望自己能到达乌云的上面,但那里总那么的遥不可及。

我想也年轻,我可以一直向上,比太阳的高度还要高,聚集炽热的光芒照亮黑暗;我想我也平凡,我可以在途经的某个美丽小镇安定下来,种上一院子的花,看着它们绽放枯萎;我想我也迷惘,迷惘……