在PHP中怎样调用C程序?

之所以遇到这个问题,正如网上所说,一般会有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)的函数。

建立扩展的框架

这张图把新建一个扩展的步奏写的很详细了,网上资料也比较丰富,在此不赘述了。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180213G0F81S00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券