`
阿尔萨斯
  • 浏览: 4176065 次
社区版块
存档分类
最新评论

想要精通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

  1. intpcntl_fork(void)

C

可以看出两者其实没区别,就连返回值都是一样的。如果在父进程里,返回值是子进程的进程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库中用来打开文件所用 的函数

  1. FILE*fopen(constchar*pathname,constchar*type);


其中的type参数又和PHP中的fopen()的mode参数一模一样。如果你知道C中的fopen()函数,那PHP的相关函数你等于无师自通了。

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

  1. //signalhandlerfunction
  2. functionsig_handler($signo)
  3. {
  4. switch($signo){
  5. caseSIGTERM:
  6. //handleshutdowntasks
  7. exit;
  8. break;
  9. caseSIGHUP:
  10. //handlerestarttasks
  11. break;
  12. caseSIGUSR1:
  13. echo"CaughtSIGUSR1.../n";
  14. break;
  15. default:
  16. //handleallothersignals
  17. }
  18. }
  19. echo"Installingsignalhandler.../n";
  20. //setupsignalhandlers
  21. pcntl_signal(SIGTERM,"sig_handler");
  22. pcntl_signal(SIGHUP,"sig_handler");
  23. pcntl_signal(SIGUSR1,"sig_handler");



C

  1. staticvoidsig_usr(int);
  2. intmain(void){
  3. if(signal(SIGUSR1,sig_user)==SIG_ERR)
  4. err_sys("can'tcatchSIGUSR1");
  5. if(signal(SIGUSR2,sig_user)==SIG_ERR)
  6. err_sys("can'tcatchSIGUSR2");
  7. for(;;)
  8. pause();
  9. }
  10. staticvoidsig_usr(intsigno){
  11. if(signo==SIGUSR1)
  12. printf("receivedSIGUSR1/n");
  13. elseif(signo==SIGUSR2)
  14. printf("receivedSIGUSR2/n");
  15. else
  16. err_dump("receivedsignal%d/n",signo);
  17. }



不难看出,又和前面的一些例子一样,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

mynamesucks的技术blog

分享到:
评论

相关推荐

    UNIX下C语言编程

    学习linux之前首先得掌握其前身,unix是linux发展的原型,学好编写linux应用程序才可以更加深入地学习驱动,了解linux内核

    学好Linux的几点建议.pdf

    学好Linux的几点建议.pdf

    新手想要学好linux的十大命令

    这是学习linux有用的帮手哦,特别是对于新手来说,掌握命令就是掌握了linux

    Linux、Unix编程指南(第三版)

    一个系统管理员或用户学好怎样使用Shell编写程序是最起码的skills之一,Linux下普遍使用Bash shell,Korn Shell是Unix系统下标准的一个脚本语言,称之为ksh。Korn shell中的许多特性使它成为系统管理员创建脚本的一...

    要学好Linux,要做哪些准备呢?

    本文是关于要学好Linux需要做的前期准备呢。

    linux 脚本大全 linux技术

    本书是一本深入学习Linux开发技术的书籍。...作为系统与用户之间的交互接口,shell几乎是你在UNIX工作平台上最亲密的朋友,因此,学好shell,是学习Linux/UNIX的的开始,并且它会始终伴随你的工作学习。

    怎样才能学好linux?

    教你怎样才能学好linux 基本的linux的知识是需要具备的,其他还需要掌握的知识有ARM和C语言编程,每一方面知识的掌握熟练程度都最终决定了个人进行嵌入式linux开发的综合能力。

    [Linux电子书合集].ABS_Guide_cn

    几乎是你在 UNIX 工作平台上最亲密的朋友,因此,学好 shell,是学习 Linux/UNIX 的的开始,并且它会始终伴随你的工作学习。 shell 是如此地重要,但令人惊奇的是,介绍 shell 的书没有真正令人满意的。所幸的是...

    一天学好Linux下的软件安装.part2.rar

    一天学好Linux下的软件安装.....

    LinuxBash脚本编程大全

    毫无疑问,UNIX/Linux最重要的软件之一就是shell,目前最流行的shell被称为Bash(Bourne Again Shell),几乎所有的Linux和绝大部分的UNIX都可以使用Bash。作为系统与用户之间的交互接口,shell几乎是你在UNIX工作平台...

    Linux常用的操作技巧解析,如何快速学好Linux编程技术.docx

    # Linux常用的操作技巧解析,如何快速学好Linux编程技术 Linux是一个广泛使用的开源操作系统,具有强大的功能和灵活性。学习Linux编程技术可以为你提供职业发展和个人成长带来很多好处。以下是一些常用的Linux操作...

    怎样才能学好C语言

    怎样才能学好C语言,C语言入门!初学的应该看看!

    ABS-Guide-cn(shell编程经典教材)

    Bash(Bourne Again Shell),几乎所有的Linux和绝大部分的UNIX都可以使用Bash。作为系 统与用户之间的交互接口,shell几乎是你在UNIX工作平台上最亲密的朋友,因此,学好 shell,是学习Linux/UNIX的的开始,并且它会...

    怎样才能学好PHP

    怎样才能学好PHP PHP是一门高效的网络编程语言,由于它具有编写灵活、运行快速等优点,迅速成为Web程序员的首选语言。前不久的一份权威调查表明,现在已经有31.6%的网站使用PHP作为主要的服务器端编程语言。  ...

    一天学好Linux下的软件安装

    一天学好Linux下的软件安装 一天学好Linux下的软件安装

    linux脚本大全内含大量的linux命令

    毫无疑问,UNIX/Linux最重要的软件之一就是shell,目前最流行的shell被称为Bash(Bourne Again Shell),几乎所有的Linux和绝大部分的UNIX都可以使用Bash。作为系统与用户之间的交互接口,shell几乎是你在UNIX工作平台...

    高级Bash脚本编程指南.pdf.chm and shell脚本编写基础 and ExpectCourse.pdf

    Bash(Bourne Again Shell),几乎所有的 Linux 和绝大部分的 UNIX 都可以使用 Bash。作为系 统与用户之间的交互接口,shell 几乎是你在 UNIX 工作平台上最亲密的朋友,因此,学好 shell,是学习 Linux/UNIX 的的开始,并且...

    一天学好Linux下的软件安装.part1.rar

    一天学好Linux下的软件安装.part1.rar

    怎样才能学好linux

    linux初学者的良师益友,教你如何快速学习linux。

Global site tag (gtag.js) - Google Analytics