最近因为在win 服务器搭建php服务,发现php-cgi.exe 很容易崩溃,看cpu和硬盘都没有暴涨,也不知道啥原因,网上查发现有一款xxfpm 小应用可以解决这个问题,但这个应用是2011年开发的,虽然作者在github上的最新更新时间是5年前,但还是预留了一些小问题,作为完美主义者决定改进下。

主要问题有2:

1、该工具不是双击启动,需要cmd启动,但这样启动不能后台运行。

2、从评论看而且我也亲自尝试后确认,该工具在关机或重启时会弹出未能成功关闭的错误窗口,虽然只是一闪而过。作者给的答复是关机前应先手动关闭xxfpm。

针对问题1,网上关于后台运行的解决方式都是用一个RunHiddenConsole.exe 程序来控制,但是这个RunHiddenConsole.exe 身出何处,我实在是没找到,,,对于来源不明工具的使用还是要谨慎的。但好在一下子就找到了另一个宝贝: *.vbe 或 *.vbs 文件。查资料VBS的全称是:Microsoft Visual Basic Script Edition(微软基于VB的脚本语言)。vbe是vbs的密文版,右键编辑看不到明文,但我可能是直接手动编辑的原因,发现两者都可以编辑明文。

vbe使用方式为,在php-cgi.exe 所在文件夹下新建两个文件 php-cgi-start.bat 和 php-cgi.start.vbe,内容如下:

php-cgi-start.bat 内容:

php-cgi.exe -b 127.0.0.1:9000 -c php.ini
php-cgi-start.vbe 内容:

DIM objShell
set objShell = wscript.createObject(“wscript.shell”)
iReturn = objShell.Run(“cmd.exe /C php-cgi-start.bat”, 0, TRUE)

双击php-cgi-start.vbe 则可以启动php-cgi.exe 后台运行。

对于vbe 后台运行 xxfpm 是一样的方法:

首先需要将 xxfpm 和 pthreadGC2.dll 放到php-cgi.exe 所在的文件夹下,pthreadGC2.dll 为 xxfpm引用的类库,是必须文件。网上以前的介绍是将该文件添加进注册表,本人发现并不需要,只要跟xxfpm放在同一个文件夹下即可,而且作者已经将pthreadGC2.dll上传到了github上,无需去别的资源下载。

然后我们创建 xxfpm.bat 和 xxfpm.vbe 文件,内容如下:

xxfpm.bat 内容:

xxfpm “php-cgi.exe -c php.ini” -n 3 -p 9000

xxfpm.vbe 内容:

DIM objShell
set objShell = wscript.createObject(“wscript.shell”)
iReturn = objShell.Run(“cmd.exe /C xxfpm.bat”, 0, TRUE)

双击xxfpm.vbe后查看任务管理器,发现xxfpm和n个php-cgi.exe 已经在运行而且没有弹出任何窗口。

对应问题2,想到的自然是在关机前通知xxfpm关闭进程,于是开始了漫漫学习之路~~~~~~~~~

从xxfpm 源文件main.c可知,该程序为C语言所做,但是我对C一无所知啊,这次肯定是要改源码的。为了荣誉,不是,为了完美主义,只能硬着头皮硬上了。

本来我学习的第一语言是C#,虽然现在工作上已经不用它了,但平时还会开发点winform小玩意,所以电脑上还有vs2015的开发环境,自然而然本次首选开发C的工具就是它了。

然后遇到了第一个问题,创建完C语言项目,添加main.c 文件后发现缺少很多h头文件,里面原来即有win32的也有linux环境的头文件,于是把linux的那些头文件都删掉,然后又通过网上说的管理NuGet程序包添加pthread引用文件,编译后又报 timespec 已定义,注释掉该定义又报其它一堆错误。。。最终只得放弃vs开发。。。

重新看了一遍xxfpm作者的文章,说是借鉴了 cygwin 里的一些源码,cygwin是什么?原来是一个在windows模仿linux环境的工具,果断安装!!!

安装完成并配置环境变量后编写了第一个hello world程序,并通过 gcc hello.c -o hello 生成可执行文件hello.exe,但是,该文件移植到别的电脑运行提示缺少cygwin1.dll的引用!!!以为是参数有误,于是学习了该语法的各个参数-egcsoW等使用,发现还是不行。。。网上又找了一堆都是复制粘贴的资料,有的说把cygwin1.dll 文件复制到系统目录下,但是这治标不治本啊,总不能让所有使用的人都配置cygwin1.dll文件吧(虽然也可以,但那太差劲了!),还有一种说法是在编译的时候加入 -mno-mingw,试了下提示没有该参数,然后又查资料说cygwin早已抛弃了该参数,于是一下子又陷入了窘境没了方向。。。

忽然想到作者的博客里会不会有介绍到自己的开发环境,毕竟所有的人都是从一步步搭建环境开始的,于是翻看了作者所有除了跟照片有关的博客,果然有所发现,在某个评论里有人问用的什么开发工具,作者说是mingw32 ,纳尼,这又是个啥,,,原来它是一个在windows环境编译gcc的工具,而且比cygwin更适合windows环境!

于是又是一通安装,但是因为墙的原因,只安装成功了gcc 和 g++,而gdb始终安装不上,官网的gdb资源后缀是lzma,查了下也是一种压缩文件,但是还需要特殊的解压命令,而gdb是用来调试的,所以不安装对编译也没有影响,果断不安装。将原来的cygwin从环境变量里移除,改为mingw32绑定系统环境变量,仍然可以在cmd使用gcc

再一次踏上编译之路。还是缺少pthread头文件,从网上搜到需要将pthread对应文件添加到对应的文件夹下,其中 (pthread.h 、 sched.h、semaphore.h)三个 头文件放到 MinGW/include文件夹,libpthreadGC2.a 放到 MinGW/lib文件夹下并重命名为libpthread.a。然后满怀信心的编译 gcc -o main main.c -lpthread,结果又报一堆问题如:undefined reference to `WSACleanup@0’,搜了下是缺少win32的库引用,需要加 -lWs2_32,加上后果然编译成功!!!!开心的像个宝宝!!!!

最终编译成功语句:

gcc -o main main.c -lpthread -lWs2_32

拷贝生成的main.exe文件到php文件夹下执行没问题!!!

接下来是修改源文件添加关机或重启时关闭xxfpm进程。

其实在改用cygwin之前,尝试在vs里编译过一个C启动停止winform的实例,在关机或重启时确实能捕捉到关闭通知,然后可以执行阻断或其他的一些操作,但xxfpm不是winform的,所以代码还不能直接拿来用,得另查代码。

xxfpm源码中启用进程用的是 createProcess,按此查相应关闭进程的方法,要么是 TerminateProcess,要么是ExitProcess,但这两个显然都是主动调用的,并不能像winform那样主动监听关机消息。。。然后有个说主动监听的函数是SetConsoleCtrlHandler,测试发现并没有用!!!!经过再三努力,也没有找到有用的信息,有资料说createProcess 创建的进程是无法做到的(希望有C++相关方面的大神帮忙解答下有没有想要的方法),所以又懵了,像一只失去梦想的咸鱼。。。。

当我准备放弃时,忽然发现经过我删减只保留win的代码在关机时没有弹出错误窗口!!!!!开机又试了一次原xxfpm又报错,再试一次自己编译的果然不报错!!!!所以问题是在专用于linux那段代码在win上有问题,没有去挨个验证具体是哪一段的问题,但现在删掉后是没有问题啦!!!!开心,关机,改天再续!!!!

经过前面编译和测试文章一开始的两个问题都解决了,但后台运行后如果报错无法知晓,于是觉得给它添加写日志到文件的功能,经过一番学习已实现,其中运行(启动和重启)日志记录在log.txt中,错误日志记录在 error_log.txt 中。由于只保留了win版本功能,故编译后执行文件命名为xxfpmW。
亚马逊测评 www.yisuping.com

xxfpmW 的诞生过程相关推荐

  1. 《HTML5+CSS3网页设计入门必读》——第1章 标记简史1.1 从IETF到W3C:HTML 4的诞生过程...

    本节书摘来自异步社区<HTML5+CSS3网页设计入门必读>一书中的第1章,第1.1节,作者: [英]Jeremy Keith , [美]Dan Cederholm 更多章节内容可以访问云 ...

  2. 一个产品的诞生过程全程记录(二)

    一个产品的诞生过程全程记录(二) 今天开始做电气部分,目前电气部分的架构为 1.三路无刷直流驱动 2.做姿态PID算法用的MCU 3.保护与电源管理电路 4.FPGA驱动电路 三路无刷驱动部分打算选用 ...

  3. 博客诞生过程与变革:十年来谁是写博客第一人?

    北京时间3月21日,国外媒体有文章称,假如没有一亿人每天热衷于写Blog,那么Blog可能不会成为目前互联网上最主要的应用之一.于是,不止一个人声称自己是第一个写Blog的人.到底谁才是第一个真正写B ...

  4. vcs中一个simv的诞生过程

    叨叨 1.本来有打算写一篇长文来介绍的,但是无奈自身水平不足,再加上实在懒得写那么多字,所以本文相当于是一个缩减版,意思到了就行. 2.发现做验证如果想继续深入,可以去补充下编译原理的相关知识. 正文 ...

  5. 产品诞生过程--导图

  6. React 的诞生过程

    01 字符拼接时代 - 2004 时间回到 2004 年,Mark Zuckerberg 当时还在宿舍捣鼓最初版的 Facebook . 这一年,大家都在用 PHP 的字符串拼接(String Con ...

  7. python自动发弹幕_一个直播弹幕机器人诞生过程,Python制作自动发送弹幕小程序...

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬取B站弹幕视频讲解 https://www.bilibili.com/vide ...

  8. 一个直播弹幕机器人诞生过程,Python制作自动发送弹幕小程序

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬取B站弹幕视频讲解 https://www.bilibili.com/vide ...

  9. 研究第一台电子计算机的过程,世界上第一台计算机诞生的过程

    世界上第一台计算机诞生的过程 世界上第一台电子计算机诞生过程 世界上第一台电子计算机诞生过程 世界上第一台电子计算机是个庞然大物:重30吨,占地150平方米,肚子里装有18800只电子管.它是1954 ...

最新文章

  1. pytest框架安装(MacOS)
  2. 初学者学习Python,掌握这些实用小技巧能快速入门!
  3. EA和Take-Two游戏业巨头纷纷陷入困境
  4. MFC中获取任务栏大小
  5. 杜教筛模板(P4213 【模板】杜教筛(Sum))
  6. profile、服务、特征、属性之间的关系
  7. Leetcode--215. 数组中第K个最大元素
  8. ubuntu中执行jupyter格式代码
  9. Mac 安装virtualbox 虚拟机用移动硬盘遇到的VERR_WRITE_PROTECT
  10. RestTemplate.getForObject返回List的时候处理方式
  11. 远程服务器spyder,spyder和远程ssh python解释器
  12. protues仿真出现Simulation is not running in real time....的情况处理
  13. 编辑为什么建议转投_编辑建议转投更合适的期刊_建议改投其他期刊是什么意思_改革期刊投稿要求...
  14. STM32学习笔记(二)
  15. webfont.woff2和webfont.woff下载超时报404错误
  16. 计算机无线鼠标用不了怎么办,无线鼠标没反应,教您无线鼠标没反应该怎么办...
  17. 【Tableau 图表大全21】之箱型图(盒须图)
  18. pytorch损失函数中‘reduction‘参数
  19. 如何让思路更清晰?simplemind for Mac思维导图来帮忙
  20. 潘多拉 rt thread lcd

热门文章

  1. 7天人工智能训练营,带你玩转机器学习与神经网络算法!(含6大实战练习,限200人)...
  2. 使用SQL聚合函数,分组,完成数据合并,字段拼接或者字段追加
  3. Flowable UI制作流程图
  4. JAVA I/0流学习(二)
  5. 从投递到拿到offer,这份Android面试秘籍一文全解,kotlin开源项目
  6. 一芯拿捏丨APM32F107单相并网储能变流器应用方案
  7. 使你更有思想的20本书
  8. 写了一个开机启动,监听通话的demo
  9. 微信消灭病毒哪个服务器好,消灭病毒怎么玩 微信小程序98k攻略
  10. C语言学习打卡day1——身高单位换算