想要精通PHP吗?先学好Linux/Unix和C吧

linuxunix 2009-03-19

现在的IT市场很浮躁,充斥着各种各样的所谓“精通”,在求职简历上比比皆是。但是本文目的不在于讨论精通的标准,也不想去批评现在漫天的精通。就让我们暂且认同“精通”这两个字,来讨论下Linux/Unix(以下简称Linux)和C对精通PHP的帮助。另外要说明下的是,这里说的精通PHP只是纯粹对于PHP来说的,并不是指web开发,所以javascript,HTML或者Ajax,smarty,CSS这类都不在讨论范围。

首先无论从哪个方面看,PHP和Linux都是最好的组合。虽然PHP也能在windows上运行,但是有些功能却实现不了。举个例子就是进程控制的功能PCNTL,其中有一个函数是pcntl_fork(),如果这个函数运行成功的话,会产生一个子进程。这个对于想在后台产生多个进程来执行多个任务的应用来说非常有用,但是这个函数库在windows下是不可用的,当然一些第三方软件可以解决windows下的问题,比如pstools,但这本身已经是PHP之外的东西了。如果你再研究一下在Linux下相同功能的C程序怎么写后,你会发现PHP其实就是Linux下C程序的翻版,不同的只是函数名称而已。下面是PHP的pcntl_fork()函数和C中的相应fork()函数的比较。

PHP
view plaincopy to clipboardprint?
int pcntl_fork (void)
int pcntl_fork (void)

C

view plaincopy to clipboardprint?
pid_t fork(void)
pid_t fork(void)

 

可以看出两者其实没区别,就连返回值都是一样的。如果在父进程里,返回值是子进程的进程ID,如果在子进程里,返回值是0。
当然大家都知道,PHP的源代码本身就是用C写的,并且又都是在Linux平台下,所以相像是必然的。

这只是表面的东西,但足以证明Linux和C对PHP的重要性,下面让我们再来看看更深层次的东西,这些会使你更有兴趣去学好Linux,为了更好的“精通”PHP。

当你要使用PHP脚本来发送一封邮件的时候,由于要调用诸如sendmail或者qmail等邮件服务以至于可能会造成程序load很久,或者调用某个远程的web service时的时候,由于网络问题而造成程序干脆就不响应或者终止了。这个时候你可能会想到把这些进程放到后台去运行,而当前程序仍然向后继续执行。对,这个想法是正确的,一般我们会用exec()函数来使用命令行执行某个速度缓慢的进程,然后在命令行里加上些参数就可以做到让命令行执行的程序在后台运行而不影响当前的进程。这个参数就是"&",另外还要把输出重定向到某个文件,可以用">>"来重定向输出。这个也许有些人知道,但是不知道的人可能更多,因为这并不是PHP的功能,而且Linux的参数和重定向输出的写法。我记得3年多前我在做这个功能的时候整整在网上搜索加自己试了一个下午才搞定,但是如果当时我就熟悉Linux的话,相信这个问题顶多也就花10分钟。

再比如我以前有篇文章写到的PHP中的fopen()函数和file_get_contents()函数里面的参数问题。fopen()的mode参数和file_get_contents()中的flag参数都是指定以什么形式方式打开文件,其中的"b"或者FILE_BINARY是指定以二进制形式打开文件。如果熟悉Linux的话,就知道在Linux下打开文件时是不需要指定是以二进制形式还是以文本形式打开文件的,因为Linux对于二进制文件和文本文件并不区分。这里要注意的是,windows下是区分的,所以为了保证移植性,最好还是指定这个参数。同样的在C中标准I/O库中用来打开文件所用的函数

view plaincopy to clipboardprint?
FILE *fopen(const char *pathname, const char *type) ;
FILE *fopen(const char *pathname, const char *type) ;
其中的type参数又和PHP中的fopen()的mode参数一模一样。如果你知道C中的fopen()函数,那PHP的相关函数你等于无师自通了。

最后再举个信号的例子。信号是系统中很重要的一个机制,是异步事件的经典实例。这个功能在平时使用PHP时很少用到,即使用到了也就是简单的使用pcntl_signal(),pcntl_alarm()一下就算完了,有几个人会去研究这些函数背后的原理呢。事实上光信号的种类就有数十种,当然我们不必每个都熟知,但是知道个大概对编程人员是非常有好处的,而只知道如何使用却不知道原理是现今极大一部分程序员的通病。如果你有空钻研下Linux信号这部分的知识,你就会有拨开云雾拨云见日的感觉。

相关推荐