- 浏览: 610335 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
kangh:
转载的也拿出来 都不试一下 完全错误
Nginx+ffmpeg的HLS开源服务器搭建配置及开发详解 -
wangtxlz:
#cd builders/cmake#cmake .系统提示命 ...
crtmpserver流媒体服务器的介绍与搭建 -
hnraysir:
支持支持支持
手机Android音视频采集与直播推送,实现单兵、移动监控类应用 -
wuent:
把web服务器和php框架绑定到一起?真不建议这样。。。
Swoole(PHP高级Web开发框架) -
wuent:
有更详细的性能比较吗?php,python,java
PHP中的(伪)多线程与多进程
1、 前言
首先,确保你的机器安装了apache和php。假设apache的安装目录为/usr/local/apache2,php的安装目录为/usr/local/php
此外你还需要一份php源码(可以从http://www.php.net/downloads.php上获取),假设我们的php源码保存在/home/sunlylorn/php下。
2、 实战
我们要写一个php扩展:myExt
[c-sharp] view plaincopyprint?
cd /home/sunlylorn/php/ext
ext_skel --extname=myExt
cd myExt
vi config.m4
先来看一下一个默认的config.m4文件,如下所示:
[c-sharp] view plaincopyprint?
dnl $Id$
dnl config.m4 for extension myExt
dnl Comments in this file start with the string 'dnl'.
dnl Remove where necessary. This file will not work
dnl without editing.
dnl If your extension references something external, use with:
dnl PHP_ARG_WITH(myExt, for myExt support,
dnl Make sure that the comment is aligned:
dnl [ --with-myExt Include myExt support])
dnl Otherwise use enable:
dnl PHP_ARG_ENABLE(myExt, whether to enable myExt support,
dnl Make sure that the comment is aligned:
dnl [ --enable-myExt Enable myExt support])
if test "$PHP_MYEXT" != "no"; then
dnl Write more examples of tests here...
dnl # --with-myExt -> check with-path
dnl SEARCH_PATH="/usr/local /usr" # you might want to change this
dnl SEARCH_FOR="/include/myExt.h" # you most likely want to change this
dnl if test -r $PHP_MYEXT/$SEARCH_FOR; then # path given as parameter
dnl MYEXT_DIR=$PHP_MYEXT
dnl else # search default path list
dnl AC_MSG_CHECKING([for myExt files in default path])
dnl for i in $SEARCH_PATH ; do
dnl if test -r $i/$SEARCH_FOR; then
dnl MYEXT_DIR=$i
dnl AC_MSG_RESULT(found in $i)
dnl fi
dnl done
dnl fi
dnl
dnl if test -z "$MYEXT_DIR"; then
dnl AC_MSG_RESULT([not found])
dnl AC_MSG_ERROR([Please reinstall the myExt distribution])
dnl fi
dnl # --with-myExt -> add include path
dnl PHP_ADD_INCLUDE($MYEXT_DIR/include)
dnl # --with-myExt -> check for lib and symbol presence
dnl LIBNAME=myExt # you may want to change this
dnl LIBSYMBOL=myExt # you most likely want to change this
dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
dnl [
dnl PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $MYEXT_DIR/lib, MYEXT_SHARED_LIBADD)
dnl AC_DEFINE(HAVE_MYEXTLIB,1,[ ])
dnl ],[
dnl AC_MSG_ERROR([wrong myExt lib version or lib not found])
dnl ],[
dnl -L$MYEXT_DIR/lib -lm
dnl ])
dnl
dnl PHP_SUBST(MYEXT_SHARED_LIBADD)
PHP_NEW_EXTENSION(myExt, myExt.c, $ext_shared)
fi
[c-sharp] view plaincopyprint?
//修改如下三行:
dnl PHP_ARG_ENABLE(myExt, whether to enable myExt support,
dnl Make sure that the comment is aligned:
dnl [ --enable-myExt Enable myExt support])
//为
PHP_ARG_ENABLE(myExt, whether to enable myExt support,
dnl Make sure that the comment is aligned:
[ --enable-myExt Enable myExt support])
注解:
config.m4 文件负责在配置时解析configure 的命令行选项。凡是带有 dnl 前缀的都是注释,注释是不被解析的。
[c-sharp] view plaincopyprint?
//当然你也可以修改如下三行:
dnl PHP_ARG_WITH(myExt, for myExt support,
dnl Make sure that the comment is aligned:
dnl [ --with-myExt Include myExt support])
//为
PHP_ARG_WITH(myExt, for myExt support,
dnl Make sure that the comment is aligned:
[ --with-myExt Include myExt support])
不同之处在于下面调用configure编译时是使用--with-myExt还是--enable-myExt。当需要引用外部文件时使用第一个选项(就像用 -–with-apache 指令来引用 Apache 的目录一样),后者正好相反。不过,不管你使用哪一个指令,你都应该注释掉另外一个。
[c-sharp] view plaincopyprint?
phpize //执行这一步的目的是根据config.m4文件的内容生成configure文件
configure --enable-myExt
修改php_myExt.h与myExt.c完成功能
make //这时,在myExt/modules目录就应该已经生成了myExt.so扩展模块了
make install //会自动把生成的myExt.so模块拷贝到php认为正确的扩展目录,我测试的时候此目录为 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/
你也可以手动把myExt.so扩展拷贝到想要的目录
修改php.ini文件,添加extension=myExt.so
/usr/local/apache2/bin/apachectl restart //重启apache
至此,一个最简单的php扩展我们已经完成了。下面我们来测试一下。
注意到扩展目录下存在一个名为myExt.php的文件,该文件是自动生成的。我们先来看一下该文件中的内容:
[c-sharp] view plaincopyprint?
<?php
$br = (php_sapi_name() == "cli")? "":"<br>";
if(!extension_loaded('myExt')) { //如果没有在php.ini文件中添加extension=myExt.so
dl('myExt.so'); //就需要动态加载myExt.so
}
$module = 'myExt';
$functions = get_extension_funcs($module); //获取被导出的扩展函数名,默认的导出函数为confirm_myExt_compiled()
echo "Functions available in the test extension:$br/n";
foreach($functions as $func) {
echo $func."$br/n";
}
echo "$br/n";
$function = 'confirm_' . $module . '_compiled';
if (extension_loaded($module)) {
$str = $function($module);
} else {
$str = "Module $module is not compiled into PHP";
}
echo "$str/n";
?>
运行/usr/local/php/bin/php myExt.php
你可以看到如下输出:
Functions available in the test extension:
confirm_myExt_compiled
Congratulations! You have successfully modified ext/myExt/config.m4. Module myExt is now compiled into PHP.
接下来,你就可以在自己的php代码中使用confirm_myExt_compiled()函数了
首先,确保你的机器安装了apache和php。假设apache的安装目录为/usr/local/apache2,php的安装目录为/usr/local/php
此外你还需要一份php源码(可以从http://www.php.net/downloads.php上获取),假设我们的php源码保存在/home/sunlylorn/php下。
2、 实战
我们要写一个php扩展:myExt
[c-sharp] view plaincopyprint?
cd /home/sunlylorn/php/ext
ext_skel --extname=myExt
cd myExt
vi config.m4
先来看一下一个默认的config.m4文件,如下所示:
[c-sharp] view plaincopyprint?
dnl $Id$
dnl config.m4 for extension myExt
dnl Comments in this file start with the string 'dnl'.
dnl Remove where necessary. This file will not work
dnl without editing.
dnl If your extension references something external, use with:
dnl PHP_ARG_WITH(myExt, for myExt support,
dnl Make sure that the comment is aligned:
dnl [ --with-myExt Include myExt support])
dnl Otherwise use enable:
dnl PHP_ARG_ENABLE(myExt, whether to enable myExt support,
dnl Make sure that the comment is aligned:
dnl [ --enable-myExt Enable myExt support])
if test "$PHP_MYEXT" != "no"; then
dnl Write more examples of tests here...
dnl # --with-myExt -> check with-path
dnl SEARCH_PATH="/usr/local /usr" # you might want to change this
dnl SEARCH_FOR="/include/myExt.h" # you most likely want to change this
dnl if test -r $PHP_MYEXT/$SEARCH_FOR; then # path given as parameter
dnl MYEXT_DIR=$PHP_MYEXT
dnl else # search default path list
dnl AC_MSG_CHECKING([for myExt files in default path])
dnl for i in $SEARCH_PATH ; do
dnl if test -r $i/$SEARCH_FOR; then
dnl MYEXT_DIR=$i
dnl AC_MSG_RESULT(found in $i)
dnl fi
dnl done
dnl fi
dnl
dnl if test -z "$MYEXT_DIR"; then
dnl AC_MSG_RESULT([not found])
dnl AC_MSG_ERROR([Please reinstall the myExt distribution])
dnl fi
dnl # --with-myExt -> add include path
dnl PHP_ADD_INCLUDE($MYEXT_DIR/include)
dnl # --with-myExt -> check for lib and symbol presence
dnl LIBNAME=myExt # you may want to change this
dnl LIBSYMBOL=myExt # you most likely want to change this
dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
dnl [
dnl PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $MYEXT_DIR/lib, MYEXT_SHARED_LIBADD)
dnl AC_DEFINE(HAVE_MYEXTLIB,1,[ ])
dnl ],[
dnl AC_MSG_ERROR([wrong myExt lib version or lib not found])
dnl ],[
dnl -L$MYEXT_DIR/lib -lm
dnl ])
dnl
dnl PHP_SUBST(MYEXT_SHARED_LIBADD)
PHP_NEW_EXTENSION(myExt, myExt.c, $ext_shared)
fi
[c-sharp] view plaincopyprint?
//修改如下三行:
dnl PHP_ARG_ENABLE(myExt, whether to enable myExt support,
dnl Make sure that the comment is aligned:
dnl [ --enable-myExt Enable myExt support])
//为
PHP_ARG_ENABLE(myExt, whether to enable myExt support,
dnl Make sure that the comment is aligned:
[ --enable-myExt Enable myExt support])
注解:
config.m4 文件负责在配置时解析configure 的命令行选项。凡是带有 dnl 前缀的都是注释,注释是不被解析的。
[c-sharp] view plaincopyprint?
//当然你也可以修改如下三行:
dnl PHP_ARG_WITH(myExt, for myExt support,
dnl Make sure that the comment is aligned:
dnl [ --with-myExt Include myExt support])
//为
PHP_ARG_WITH(myExt, for myExt support,
dnl Make sure that the comment is aligned:
[ --with-myExt Include myExt support])
不同之处在于下面调用configure编译时是使用--with-myExt还是--enable-myExt。当需要引用外部文件时使用第一个选项(就像用 -–with-apache 指令来引用 Apache 的目录一样),后者正好相反。不过,不管你使用哪一个指令,你都应该注释掉另外一个。
[c-sharp] view plaincopyprint?
phpize //执行这一步的目的是根据config.m4文件的内容生成configure文件
configure --enable-myExt
修改php_myExt.h与myExt.c完成功能
make //这时,在myExt/modules目录就应该已经生成了myExt.so扩展模块了
make install //会自动把生成的myExt.so模块拷贝到php认为正确的扩展目录,我测试的时候此目录为 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/
你也可以手动把myExt.so扩展拷贝到想要的目录
修改php.ini文件,添加extension=myExt.so
/usr/local/apache2/bin/apachectl restart //重启apache
至此,一个最简单的php扩展我们已经完成了。下面我们来测试一下。
注意到扩展目录下存在一个名为myExt.php的文件,该文件是自动生成的。我们先来看一下该文件中的内容:
[c-sharp] view plaincopyprint?
<?php
$br = (php_sapi_name() == "cli")? "":"<br>";
if(!extension_loaded('myExt')) { //如果没有在php.ini文件中添加extension=myExt.so
dl('myExt.so'); //就需要动态加载myExt.so
}
$module = 'myExt';
$functions = get_extension_funcs($module); //获取被导出的扩展函数名,默认的导出函数为confirm_myExt_compiled()
echo "Functions available in the test extension:$br/n";
foreach($functions as $func) {
echo $func."$br/n";
}
echo "$br/n";
$function = 'confirm_' . $module . '_compiled';
if (extension_loaded($module)) {
$str = $function($module);
} else {
$str = "Module $module is not compiled into PHP";
}
echo "$str/n";
?>
运行/usr/local/php/bin/php myExt.php
你可以看到如下输出:
Functions available in the test extension:
confirm_myExt_compiled
Congratulations! You have successfully modified ext/myExt/config.m4. Module myExt is now compiled into PHP.
接下来,你就可以在自己的php代码中使用confirm_myExt_compiled()函数了
发表评论
-
nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket
2015-04-02 11:14 1472前几天看到一篇博客,提到php所在服务器在大并发情况下,频 ... -
使用socket方式连接Nginx优化php-fpm性能
2015-04-01 13:49 0Nginx连接fastcgi的方式有 ... -
PHP中include和require的区别详解
2015-04-01 08:32 01、概要 require()语句的性能与includ ... -
PHP 中cookie 和 session 的分析
2015-03-31 12:33 0HP 中cookie 和session 的分析 ... -
php 经典的算法题你懂的
2015-03-31 12:31 0有5个人偷了一堆苹果,准备在第二天分赃。晚上,有一人遛出来, ... -
PHP最常用的2种设计模式工厂模式和单例模式介绍
2015-03-31 12:26 0简单来说,PHP单例模式就是一个功能用一个类来实现,并且在整 ... -
PHP 数据类型
2015-03-31 12:23 0PHP 数据类型 PHP 支持八种原始类型(type)。 ... -
PHP mcrypt启用、加密以及解密过程详解
2015-03-30 11:32 1463Mcrypt扩展库可以实现加密解密功能,就是既能将明文加密, ... -
PHP扩展实现类扩展
2015-03-27 14:08 580在第一篇文章中,我们所开发的扩展是单个函数,本篇文章看一下 ... -
PHP高级工程师的面试题
2015-03-06 10:35 01. 基本知识点 HTTP协议中几个状态码的含义:1x ... -
PHP面试中常见的面试试题与算法例子
2015-03-05 14:14 0下面是四道比较常见的题目,主要考察的是对字符串函数以及文件操 ... -
PHP实现四种常用的排序算法
2015-03-05 14:09 0插入排序(Insertion Sort),选择排序(Sele ... -
用swagger-php/ui做API测试
2015-02-13 09:46 3652功能: 1 swagger-php根据自定义的规则生成API ... -
app后端设计(0)--总目录
2015-01-23 18:03 0做了3年app相关的系统架构,api设计,先后在3个创业公司中 ... -
PHP中eAccelerator、memcached、xcache、APC 4个加速、缓存扩展的区别
2015-01-23 10:26 919这篇文章主要介绍了PHP ... -
PHP内核探索:zend_parse_parameters函数
2015-01-16 14:14 969最简单的获取函数调用者传递过来的参数便是使用zend_pars ... -
实战:用C写php扩展(二)
2015-01-16 11:05 1001一、前言 在我的上一篇文章“实战:用C写php扩展(一)”里介 ... -
C++实现双链表
2015-01-16 10:14 0// Double_List.cpp : Defines th ... -
如何编写一个PHP的C扩展
2014-12-18 10:14 639为什么要用C扩展 C是静态编译的,执行效率比PHP代码高很 ... -
JavaScript or PHP 来检测移动设备
2014-09-22 10:04 635iPhone & iPod Detection T ...
相关推荐
《PHP扩展学习PDF》是一本深入探讨PHP内核机制与扩展开发的专业书籍,旨在帮助读者不仅理解PHP的工作原理,还能具备编写自己PHP扩展的能力。这本书的受众群体是那些已经掌握C语言基础,并对PHP编程有一定了解的...
- **PHP概述**:PHP(Hypertext Preprocessor)是一种通用开源脚本语言,语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。 - **PHP优势**:易于学习、跨平台支持好、执行效率高、...
在PHP开发领域,Phalcon是一个高性能的框架,它以C语言编写并作为PHP扩展运行,提供了优秀的性能和低级别的资源消耗。本项目实战将深入探讨如何利用Phalcon来构建高效、稳定的企业级Web应用。 【描述】:“使用的...
6. **数据库交互**:MySQL是常见的PHP数据库伴侣,包括PDO(PHP Data Objects)和mysqli扩展的使用,以及SQL语句的编写。 7. **Web框架**:可能介绍如Laravel、Symfony或CodeIgniter等流行的PHP框架,帮助提高开发...
语法吸收了C语言、Java以及Perl的特点,利于学习,使用灵活,支持多种数据库操作。 - **安装配置**: - **Windows环境**:推荐使用XAMPP或WAMP等集成包,这些工具包含了Apache服务器、PHP解释器及MySQL数据库,安装...
15. **PHP扩展开发**:了解如何编写C语言的PHP扩展。 16. **服务器环境配置**:Apache、Nginx等服务器的PHP配置。 17. **性能优化**:如PHP的 opcode 缓存、内存管理。 18. **单元测试**:使用PHPUnit进行代码...
- **PDO扩展**: 使用PHP的数据对象(PDO)扩展连接数据库,实现数据的增删改查操作。 #### 5. 面向对象编程(OOP) - **类与对象**: 掌握PHP中的类定义、对象实例化等面向对象编程的基本概念。 - **继承与多态**: 学习...
《PHP高级程序设计:模式框架与测试》是一本深度探讨PHP编程的专业书籍,由人民邮电出版社出版。这本书旨在帮助开发者提升PHP编程技能,掌握更高效、更灵活的开发方式,以及如何进行严谨的测试,确保代码质量和系统...
4. **兼容性好**:完美兼容PHP7及其以上版本,并且与大部分PHP扩展相容。 5. **社区活跃**:拥有一个活跃的技术社区,为用户提供技术支持和交流平台。 #### 深入解读Swoole的关键技术 1. **异步I/O**:这是Swoole...
1. **MySQL连接**:使用mysqli或PDO扩展与MySQL数据库建立连接,掌握SQL查询语句的编写。 2. **CRUD操作**:学习如何使用PHP进行数据库的创建(Create)、读取(Retrieve)、更新(Update)和删除/Delete)操作。 3. **...
- **实战案例**: 通过一个具体的站点示例来学习PHP的实际应用。 - **代码分析**: 分析站点中的PHP代码,理解其工作原理。 **3.2 数据库操作** - **连接数据库**: 学习如何使用PHP连接数据库并进行数据查询和修改。...
《PHP网站开发实例教程》是一本深入浅出的教材,旨在教授读者如何使用PHP语言进行网站开发。源代码是本书教学内容的实践部分,通过分析和运行这些代码,读者能够更直观地理解PHP编程原理和实际应用。在这个压缩包中...
Swoole是一款强大的开源C语言编写的PHP扩展,它提供了异步并行处理能力,以及在PHP中实现协程(Coroutine)的框架。Swoole的版本为v4.4.26,这个版本可能包含了优化和修复了之前版本的一些问题,使其在性能和稳定性...
- **数据库交互**:使用PDO或mysqli扩展连接数据库,执行SQL语句。 ### 三、实战项目开发 #### 1. 基于PHP的Web应用设计 - **需求分析**:明确项目的目标用户群、功能需求等。 - **架构设计**:采用MVC(Model-...
《深入PHP:面向对象、模式与实践(第三版)》是一本专为PHP开发者深入理解面向对象编程、设计模式及实践技巧而编写的经典著作。这本书涵盖了PHP开发中的核心概念,旨在帮助读者提升PHP编程的专业水平,从而在实际...