设为首页 收藏本站
查看: 855|回复: 0

[经验分享] Visual Studio 2005下编译php-5.3.8+pecl-libevent-0.0.4+libevent-2.0.15-stable

[复制链接]

尚未签到

发表于 2017-4-10 13:05:42 | 显示全部楼层 |阅读模式
最近有一个小项目需要一个后台服务器,其实在线数并不大,另一直对服务器编程技术中的epoll/iocp/异步之类的有所了解,但始终没有试过,了解到跨平台的库libev,libevent等在windows下面已经iocp,同时又有php.net又有一个对应的扩展pecl-libevent-0.0.4,于是说干就干,找了一篇参考文档http://vladimirbarbarosh.blogspo... l-libevent-004.html,一番尝试后很是失望,没搞定毕竟没有搞过C++的开发,还好经过不断地尝试总算搞定.

  附件下载:Visual Studio 2005下编译php-5.3.8+pecl-libevent-0.0.4+libevent-2.0.15-stable
  快盘分流下载
  

  附编译后的php安装包 :php-5.3.8_with_libevent-2.0.15-stable.7z
  

  再附一个php_libevent.dll适用于php-5.3.x-ts版本需要的朋友可以直接下载并在php.ini中配置即可直接使用
  

  笔记正文内容
  l环境: Window 7 (xp应该没有问题)+ Microsoft Visual Studio 2005
  l下载资源:
  nphp-5.3.8http://cn.php.net/get/php-5.3.8.tar.gz/from/a/mirror
  npecl-libevent-0.0.4http://pecl.php.net/package/libevent
  nlibevent-2.0.15-stablehttps://github.com/downloads/libevent/libevent/libevent-2.0.15-stable.tar.gz
  nPHP SDK Binary Tools http://windows.php.net/downloads/php-sdk/
  下载php-sdk-binary-tools-20110915.zip
  即http://windows.php.net/downloads/php-sdk/php-sdk-binary-tools-20110915.zip
  nPHP 5.3 Depencencies http://windows.php.net/downloads/php-sdk/deps-5.4-vc9-x86.7z
  l整理编译目录
  n创建sdkphp目录至 c 盘
  目录结构
  n创建编译php-5.3.8目录
  cmd>cdc:\phpsdk
  c:\phpsdk>bin\phpsdk_setvars.bat   (注:设置环境变量)
  c:\phpsdk>bin\phpsdk_buildtree.batphp-5.3.8 (注:生成php-5.3.8编译空目录)
  n准备编译所需要的源码
  a)复制php-5.3.8的源码至C:\phpsdk\php-5.3.8\vc8\x86\src
  b)复制deps-5.3-vc9-x86 源码 至 C:\phpsdk\php-5.3.8\vc8\x86\deps
  c)复制libevent-0.0.4 源码 至 C:\phpsdk\php_libevent
  d)复制libevent-2.0.15-stable 源码 至C:\phpsdk\php_libevent\libevent-2.0.15-stable
  n55
  l编译源码
  n准备工作
  按下图进入vs2005的命令行模式
  执行下面两个命令
  Cmd>cd \
  C:\phpsdk>bin\phpsdk_setvars.bat
  n编译php-5.3.8(部分指令会需要些时间)
  请确保你已经执行了上面的[准备工作]
  执行下面指令
  C:\phpsdk>cd php-5.3.8\vc8\x86\src
  C:\phpsdk\php-5.3.8\vc8\x86\src>buildconf
  C:\phpsdk\php-5.3.8\vc8\x86\src>configure --disable-all --enable-cli
  C:\phpsdk\php-5.3.8\vc8\x86\src>nmake
  C:\phpsdk\php-5.3.8\vc8\x86\src>nmake snap
  n编译libevent-2.0.15-stable
  请确保你已经执行了上面的[准备工作]
  按顺序执行下面指令
  C:\phpsdk>
  C:\phpsdk\>cdphp_libevent\libevent-2.0.15-stable
  C:\phpsdk\php_libevent\libevent-2.0.15-stable>nmake-f Makefile.nmake
  n编译pecl-libevent-0.0.4 并生成php_libevent.dll文件
  请确保你已经执行了上面的[准备工作]
  a) 按顺序执行下面的指令
  C:\phpsdk\php_libevent>setlibeventdir= C:\phpsdk\php-5.3.8\vc8\x86\src\Release_TS\php-5.3.8-devel-VC8-x86
  C:\phpsdk\php_libevent>setlibeventdir=C:\phpsdk\php_libevent\libevent-2.0.15-stable
  如下图
  b) 执行编译指令
  cl libevent.c ^
  /c ^
  /Fophp_libevent.obj^
  /DZEND_WIN32 ^
  /DPHP_WIN32 ^
  /DWIN32 ^
  /DZTS=1 ^
  /DZEND_DEBUG=0 ^
  /DCOMPILE_DL_LIBEVENT^
  /I%phpdevdir%\include\Zend^
  /I%phpdevdir%\include\main^
  /I%phpdevdir%\include\TSRM^
  /I%phpdevdir%\include^
  /I%libeventdir%\WIN32-Code^
  /I%libeventdir%\include^
  /I%libeventdir%
  c) 执行创建php_libevent.dll指令
  会报下面的错误
  linkphp_libevent.obj /DLL php5ts.lib /LIBPATH:%phpdevdir%\lib libevent.lib/LIBPATH:%libeventdir% ws2_32.lib
  Microsoft (R)Incremental Linker Version 9.00.30729.01
  Copyright (C)Microsoft Corporation. All rights reserved.
  Creating libraryphp_libevent.lib and object php_libevent.exp
  libevent.lib(evutil_rand.obj): error LNK2019: unresolved external symbol __imp__CryptGenRandom@12 referencedin function _arc4_seed_win32
  libevent.lib(evutil_rand.obj): error LNK2019: unresolved external symbol __imp__CryptAcquireContextA@20referenced in function _arc4_seed_win32
  php_libevent.dll: fatal error LNK1120: 2 unresolved externals
  解决方案:
  1) 删除编译后的目标文件(obj文件)
  进至目录C:\phpsdk\php_libevent\libevent-2.0.15-stable按修改时间排序查看最近生成的obj文件,删除当前目录下面的所有后缀名为obj的文件即可
  2) 修改源代码
  请修改./libevent-2.0.15-stable/arc4random.c中的arc4_seed_win32为下面的内容(即禁掉调用CryptAcquireContext和CryptGenRandom两个方法,即下图中灰掉背景的行)
  #ifdef WIN32
  #defineTRY_SEED_WIN32
  static int
  arc4_seed_win32(void)
  {
  /* This is adapted from Tor'scrypto_seed_rng() */
  static int provider_set = 0;
  static HCRYPTPROV provider;
  unsigned char buf[ADD_ENTROPY];
  /*
  if (!provider_set) {
  if(!CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL,
  CRYPT_VERIFYCONTEXT)) {
  if (GetLastError() !=(DWORD)NTE_BAD_KEYSET)
  return -1;
  }
  provider_set = 1;
  }
  if (!CryptGenRandom(provider,sizeof(buf), buf))
  return -1;
  */
  arc4_addrandom(buf, sizeof(buf));
  memset(buf, 0, sizeof(buf));
  arc4_seeded_ok = 1;
  return 0;
  }
  #endif
  3) 重新编译libevent-2.0.15-stable
  C:\phpsdk\php_libevent\libevent-2.0.15-stable>nmake -f Makefile.nmake
  4) 重新编译pecl-libevent-0.0.4
  编译之前切进目录C:\phpsdk\php_libevent 然后删除php_libevent.exp php_libevent.lib, php_libevent.obj三个文件
  执行重新编译的指令
  4.1) 执行编译php_libevent.c
  C:\phpsdk\php_libevent>cl libevent.c ^
  /c ^
  /Fophp_libevent.obj ^
  /DZEND_WIN32 ^
  /DPHP_WIN32 ^
  /DWIN32 ^
  /DZTS=1 ^
  /DZEND_DEBUG=0 ^
  /DCOMPILE_DL_LIBEVENT ^
  /I%phpdevdir%\include\Zend ^
  /I%phpdevdir%\include\main ^
  /I%phpdevdir%\include\TSRM ^
  /I%phpdevdir%\include ^
  /I%libeventdir%\WIN32-Code ^
  /I%libeventdir%\include ^
  /I%libeventdir%
  4.2) 执行生成php_libevent.dll指令
  C:\phpsdk\php_libevent>link php_libevent.obj ^
  /DLL ^
  php5ts.lib /LIBPATH:%phpdevdir%\lib ^
  libevent.lib /LIBPATH:%libeventdir% ^
  ws2_32.lib   
  l测试php_libevent模块在windows下面正常工作
  n打包编译好的发布版本
  移动C:\phpsdk\php-5.3.8\vc8\x86\src\Release_TS\php-5.3.8目录至c:\php-5.3.8
  复制C:\phpsdk\php_libevent\php_libevent.dll 至 c:\php-5.3.8\ext目录下面
  n为php添加php_libevent模块
  a) 复制c:\php-5.3.8\php.ini-production 为 c:\php-5.3.8\php.ini
  b) 在php.ini中查找;extension_dir = "ext",并解除该内容前面的逗号,php.exe将会在c:\php-5.3.8\ext目录下面查找各个打开的扩展动态库文件
  c) 打开php.ini在该文件的末尾添加一行内容为 extension=php_libevent.dll
  d) 执行下面指令
  c:\php-5.3.8>php –v (查看当前版本)
  c:\php-5.3.8>php –m (查看编译好的php都装有哪些扩展)
  n通过代码测试php_libevent已经可以正常工作了
  a) 从php手册下面复制一段代码放至c:\php-5.3.8\edemo.php
  
  1.   <?php
  2. $socket = stream_socket_server ('tcp://0.0.0.0:2000', $errno, $errstr);
  3. stream_set_blocking($socket, 0);
  4. $base = event_base_new();
  5. $event = event_new();
  6. event_set($event, $socket, EV_READ |EV_PERSIST, 'ev_accept', $base);
  7. event_base_set($event, $base);
  8. event_add($event);
  9. event_base_loop($base);
  10. $GLOBALS['connections'] = array();
  11. $GLOBALS['buffers'] = array();
  12. function ev_accept($socket, $flag, $base) {
  13. static $id = 0;
  14. $connection = stream_socket_accept($socket);
  15. stream_set_blocking($connection, 0);
  16. $id += 1;
  17. $buffer = event_buffer_new($connection, 'ev_read', NULL, 'ev_error',$id);
  18. event_buffer_base_set($buffer, $base);
  19. event_buffer_timeout_set($buffer, 30, 30);
  20. event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff);
  21. event_buffer_priority_set($buffer, 10);
  22. event_buffer_enable($buffer, EV_READ| EV_PERSIST);
  23. // we need to save both buffer and connection outside
  24. $GLOBALS['connections'][$id] = $connection;
  25. $GLOBALS['buffers'][$id] = $buffer;
  26. }
  27. function ev_error($buffer, $error, $id) {
  28. event_buffer_disable($GLOBALS['buffers'][$id], EV_READ | EV_WRITE);
  29. event_buffer_free($GLOBALS['buffers'][$id]);
  30. fclose($GLOBALS['connections'][$id]);
  31. unset($GLOBALS['buffers'][$id], $GLOBALS['connections'][$id]);
  32. }
  33. function ev_read($buffer, $id) {
  34. while ($read = event_buffer_read($buffer, 256)) {
  35. var_dump($read);
  36. }
  37. }
  38. ?>
  39.   
复制代码
  b) 执行上面的文件
  c:\php-5.3.9>php.exeedemo.php
  c) 用测试软件SocketTool进行测试
  SocketTool.exe下载地址: http://ishare.iask.sina.com.cn/f/7826641.html?from=like
  n
  lCentos 5.x下面安装php_libevent扩展
  n安装默认的libevent及开发版本
  #yum –y installlibevent libevent-devel
  n安装php_libevent扩展
  #pecl installchannel://pecl.php.net/libevent-0.0.4
  n配置php.ini使php支持libevent
  #echo “extension=libevent.so”> /etc/php.d/libevent.ini
  查看扩展是否有效
  #php –m|greplibevent
  l附参考资料:
  Compile php-5.3.6+ pecl-libevent-0.0.4 + libevent-2.0.11-stable
  http://vladimirbarbarosh.blogspot.com/2011/05/compile-php-536-pecl-libevent-004.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362981-1-1.html 上篇帖子: PHP包含文件(require/include/require_once/include_once/__autoload/spl_autoload_xxx)分析 下篇帖子: 论PHP框架设计模式及MVC的缺陷
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表