xxfpmW 的诞生过程

 

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

 

主要问题有2:linux

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

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

 


 

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

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

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

相关文章
相关标签/搜索