之所以遇到这个问题,正如网上所说,一般会有2种场景:
1、已有现成的c语言程序,想直接拿来用。
2、PHP软件的某个地方,遇到了性能瓶颈,我们希望用C语言程序来改善性能。
第一种情况,举个例子,比如某场景需要php生成uuid。目前网上流传的php生成uuid的方法主要是利用随机数和 uniqid()函数复合生成,但是在分布式,高并发的环境中,还是可能会出现低几率的重复,更重要的这种方案理论上是有缺陷的。
php的uniqid函数是基于微秒生成的,查看uniqid函数c实现的源码
可以发现,如果uniqid函数,不指定第二个参数(entropy)为true,则uniqid就是根据前缀,秒,微秒组合而成,高并发容易出现重复。
而且根据这种(时间+随机数)作为指纹,生成的uuid,并不是我们常用意义上使用的uuid。通常意义上的uuid的指纹信息包含了(MAC地址、时间戳、Namespace、随机数等),由于php不能从自己的环境变量中获取服务器的mac地址,因而这种uuid实现是伪uuid。
但是如果php程序跑在linux环境中,大可不必用这种方法。Linux有自己的uuid生成方法:
cat /proc/sys/kernel/random/uuid
我们通过php系统调用linux服务,从标准输入传入参数,从标准输出获取结果。
这也是php调用c程序的一个例子。
当然也可以把c程序封装成服务,php和c程序之间用socket或者TCP通信。比如说php脚本调用本机上的数据库服务,也可以理解成php调用了C程序。
第二种情况,因为性能问题,想用C语言代替某些php的工作。当然这种情况下,依然可以用系统调用的方式,但是频繁的系统调用,会让性能下降。所以一般的操作是把c语言的功能封装成php的扩展,通过php扩展来提高整体性能。
Php的成功也得益于pecl社区丰富的扩展,关于用c语言写一个扩展,网上也有比较多资料,大神鸟哥博客也有一篇。
http://www.laruence.com/2009/04/28/719.html
比如我们下载php7.1的源码
http://windows.php.net/download#php-7.1到此页面选择Download source code
这里直接给出zip源码包的下载地址:
http://windows.php.net/downloads/releases/php-7.1.14-src.zip
Ext目录就是php的扩展目录,其中standard目录,里面包含的就是我们的常见的函数,比如上文提到uniqid函数的源码,就在这里面。
就以鸟哥的例子,用c语言实现一个,把字符串重复n次的功能。
我们打算建立一个repeat的扩展,这个扩展里面包含一个str_repeat(str, n)的函数。
建立扩展的框架
这张图把新建一个扩展的步奏写的很详细了,网上资料也比较丰富,在此不赘述了。
领取专属 10元无门槛券
私享最新 技术干货