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

现在的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信号这部分的知识,你就会有拨开云雾拨云见日的感觉。下面再贴两段PHP和C中对信号使用的代码片段。
PHP

view plaincopy to clipboardprint?
// signal handler function
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
// handle shutdown tasks
exit;
break;
case SIGHUP:
// handle restart tasks
break;
case SIGUSR1:
echo "Caught SIGUSR1.../n";
break;
default:
// handle all other signals
}
}
echo "Installing signal handler.../n";
// setup signal handlers
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");
// signal handler function
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
// handle shutdown tasks
exit;
break;
case SIGHUP:
// handle restart tasks
break;
case SIGUSR1:
echo "Caught SIGUSR1.../n";
break;
default:
// handle all other signals
}
}
echo "Installing signal handler.../n";
// setup signal handlers
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");



C

view plaincopy to clipboardprint?
static void sig_usr(int);
int main(void) {
if(signal(SIGUSR1, sig_user) == SIG_ERR)
err_sys("can't catch SIGUSR1");
if(signal(SIGUSR2, sig_user) == SIG_ERR)
err_sys("can't catch SIGUSR2");
for ( ; ; )
pause();
}
static void sig_usr(int signo) {
if(signo == SIGUSR1)
printf("received SIGUSR1/n");
else if(signo == SIGUSR2)
printf("received SIGUSR2/n");
else
err_dump("received signal %d/n", signo);
}
static void sig_usr(int);
int main(void) {
if(signal(SIGUSR1, sig_user) == SIG_ERR)
err_sys("can't catch SIGUSR1");
if(signal(SIGUSR2, sig_user) == SIG_ERR)
err_sys("can't catch SIGUSR2");
for ( ; ; )
pause();
}
static void sig_usr(int signo) {
if(signo == SIGUSR1)
printf("received SIGUSR1/n");
else if(signo == SIGUSR2)
printf("received SIGUSR2/n");
else
err_dump("received signal %d/n", signo);
}

不难看出,又和前面的一些例子一样,PHP和C对信号的处理程序几乎是相同的。还是那句话,学好C,PHP就能很容易的无师自通了。并且熟练的使用C还可以自己编写PHP扩展,使PHP的应用范围更广,效率更高。

其他的例如文件系统,标准输入输出,时间日期处理等等,我就不一一举例子了。可以毫无悬念的说,学好Linux和C就是学好PHP的基础。

也许有些朋友会说,我Linux一窍不通,C也只是大学里学过,我平时工作也只需要读读数据库,取点数据做点处理再存回数据库,更有些朋友可能就是在Windows平台下使用PHP在工作,那就更没Linux的经验了,还不是一样干了这么久了,少则几个月,多则几年,仍然挺好的。

关于这个,我上文也说到了,现在只知道如何使用却不知道原理的程序员实在是太多了。这样只能始终在编程的最外围游走,终日受累于各种工具和框架,这个现象并不限于PHP,在Java,C#等编程语言里也同样存在。大量的工具和框架使程序员们不再专注于内在的原理,而是简单的包含和调用,一样也能完成工作。或许你认为这样也不错,那当然没问题。但是人各有志,相信还是有不少程序员是对程序背后的原理相当感兴趣的。其实并不只是兴趣这一个理由去研究原理,相反只有了解了原理,才能更好的认识程序,知道程序为什么要这么写,深入浅出,写出更优秀的程序。想想看,当别人还在讨论表面问题时,你已经从操作系统的内核出发想出了最好的解决方法并且用坚实的理论依据说服同事们按照你的想法做的时候,你就已经是真正的高手了。

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


出处http://blog.csdn.net/mynamesucks/archive/2009/02/26/3939449.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值