最近因为在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。

原 xxfpm 链接地址:https://github.com/78/xxfpm

新 xxfpmW 地址在此:

gitee:https://gitee.com/jying/xxfpmW

github:https://github.com/jying000/xxfpmW

xxfpmW 的诞生过程的更多相关文章

  1. WinMain与WndProc以及窗口诞生过程总结

    一.int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow) 四个 ...

  2. Lambda表达式的诞生过程

    这是一篇很经典的文章,解决了工作中一些使用过但是又不太明白的知识点,今天终于弄明白了.花了一晚上重新整的,坚决要分享出来!!! 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的 ...

  3. Python 装饰器的诞生过程

    ​ Python中的装饰器是通过利用了函数特性的闭包实现的,所以在讲装饰器之前,我们需要先了解函数特性,以及闭包是怎么利用了函数特性的 ① 函数特性 Python中的函数特性总的来说有以下四点: 1. ...

  4. Python开发:一个直播弹幕机器人诞生过程,自动发送弹幕

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

  5. Zygote过程【3】——SystemServer诞生

    欢迎转载.转载请注明:http://blog.csdn.net/zhgxhuaa 在ZygoteInit的main()方法中做了几件大事.当中一件便是启动Systemserver进程.代码例如以下: ...

  6. Zygote进程【3】——SystemServer的诞生

    在ZygoteInit的main()方法中做了几件大事,其中一件便是启动Systemserver进程,代码如下: @/frameworks/base/core/Java/com/Android/int ...

  7. 一个很简单的SqlServer生成常用C#语句工具的诞生

    前言: 这个文章只要是记录一下,这个工具的诞生过程.作用.其中的技术实在是太简单可以说没有什么技术~主要是锻炼一下写文章的能力! 正文: 在开发项目的时,常常会要维护或变更一些老项目,涉及到简单的几张 ...

  8. TravelCMS旅游网站系统诞生记

    本人就是一纯粹码农,没什么学历,更没什么技术,但是自认为学习能力还不错,近期有一个旅游网站系统项目正在进行中,在此以贴图记录这个项目的诞生过程,本是一个定制系统,但是不想把系统做死,以通用产品的标准来 ...

  9. 《代码的第一行——Android》封面诞生

    <代码的第一行--Android>已经上市近一个月,现在的情况是相当不错的销售,也特别感谢众多朋友的支持. 其实一本好书,假设你想卖.除了给予外力所要求的内容.封面设计是至关重要的,这本书 ...

随机推荐

  1. 【mq读书笔记】消息确认(失败消息,定时队列重新消费)

    接上文的集群模式,监听器返回RECONSUME_LATER,需要将将这些消息发送给Broker延迟消息.如果发送ack消息失败,将延迟5s后提交线程池进行消费. 入口:ConsumeMessageCo ...

  2. .nnmodel to .mlmodel

    做项目时遇到.nnmodel 模型,不知道这是什么框架模型,没有头绪,抓住文件magic number是lzfse compressed, compressed tables. 在https://gi ...

  3. Spring中的Mybatis

    1. 前言 在构建一个web应用时基本的套路就是SSM,其中的M就是Mybatis. Mybatis作为一款开源的ORM框架, 由于其易于上手的特点成为当下比较流行的ORM框架,当然它还有一款插件能够 ...

  4. Beta冲刺——总结

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 团队GitHub地 ...

  5. 2、Spring Cloud和dubbo简介

    1.Spring Cloud简介 (1).Spring Cloud简介 SpringCloud,基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负 ...

  6. 20190626_二次开发BarTender打印机_C#代码_一边读取TID_一边打印_打印机POSTEK

    demo代码如下: private void btnPrint_Click(object sender, EventArgs e) { if (this.btnPrint.Text == " ...

  7. android studio报butterknife错误

    Error:Execution failed for task ':shipper:javaPreCompileDebug'.> Annotation processors must be ex ...

  8. Linux驱动模块00

    一.驱动基础 1.什么是驱动 能够通过软件操作硬件的这份程序就是驱动 2.Linux驱动和ARM裸机驱动的区别 1)Linux设备驱动工作时依赖于Linux内核, ARM裸机驱动不依赖于Linux内核 ...

  9. Qt模型视图结构遇见的小问题

    在本文的最开始,我们来看两个帮助文档内容: selectionMode : SelectionMode This property holds which selection mode the vie ...

  10. moviepy音视频剪辑:视频剪辑基类VideoClip详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>和<moviepy音视频剪辑:moviepy中的剪辑基类Cl ...