xxfpmW 的诞生过程
最近因为在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 的诞生过程的更多相关文章
- WinMain与WndProc以及窗口诞生过程总结
一.int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow) 四个 ...
- Lambda表达式的诞生过程
这是一篇很经典的文章,解决了工作中一些使用过但是又不太明白的知识点,今天终于弄明白了.花了一晚上重新整的,坚决要分享出来!!! 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的 ...
- Python 装饰器的诞生过程
Python中的装饰器是通过利用了函数特性的闭包实现的,所以在讲装饰器之前,我们需要先了解函数特性,以及闭包是怎么利用了函数特性的 ① 函数特性 Python中的函数特性总的来说有以下四点: 1. ...
- Python开发:一个直播弹幕机器人诞生过程,自动发送弹幕
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬取B站弹幕视频讲解 https://www.bilibili.com/vide ...
- Zygote过程【3】——SystemServer诞生
欢迎转载.转载请注明:http://blog.csdn.net/zhgxhuaa 在ZygoteInit的main()方法中做了几件大事.当中一件便是启动Systemserver进程.代码例如以下: ...
- Zygote进程【3】——SystemServer的诞生
在ZygoteInit的main()方法中做了几件大事,其中一件便是启动Systemserver进程,代码如下: @/frameworks/base/core/Java/com/Android/int ...
- 一个很简单的SqlServer生成常用C#语句工具的诞生
前言: 这个文章只要是记录一下,这个工具的诞生过程.作用.其中的技术实在是太简单可以说没有什么技术~主要是锻炼一下写文章的能力! 正文: 在开发项目的时,常常会要维护或变更一些老项目,涉及到简单的几张 ...
- TravelCMS旅游网站系统诞生记
本人就是一纯粹码农,没什么学历,更没什么技术,但是自认为学习能力还不错,近期有一个旅游网站系统项目正在进行中,在此以贴图记录这个项目的诞生过程,本是一个定制系统,但是不想把系统做死,以通用产品的标准来 ...
- 《代码的第一行——Android》封面诞生
<代码的第一行--Android>已经上市近一个月,现在的情况是相当不错的销售,也特别感谢众多朋友的支持. 其实一本好书,假设你想卖.除了给予外力所要求的内容.封面设计是至关重要的,这本书 ...
随机推荐
- C++基础知识篇:C++ 变量类型
变量其实只不过是程序可操作的存储区的名称.C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字和下划线字 ...
- 深度阅读:大学生课外知识补充,这些课堂上不教的 C++ 的基本特性你都知道吗?
来源:知乎 王师傅的专栏 C++ 作为一个历史久远,功能丰(yong)富(zhong)而且标准与时俱进的语言,理应什么都能做,什么都用得起来.不过日常使用中我们初学者真的好像只学到了其中的一部分,对于 ...
- 企业安全03Django GIS SQL注入漏洞CVE-2020-9402
Django GIS SQL注入漏洞CVE-2020-9402 一.漏洞描述 Django是Django基金会的一套基于Python语言的开源Web应用框架.该框架包括面向对象的映射器.视图系统.模板 ...
- sharding事务。
我们这么操作: 本地事务,但是会发现如果有异常两边都回滚了.看代码如下: rollback看一看: cachedConnections中缓存了2个connection. 对于每个connection调 ...
- bootstrap火速布局"企业级"页面
套娃 .container(两边有margin)/container-fluid(无) 大盒,写一个当爹就行 .row 行 .col 列 列中可再嵌套行和列 大小 把屏幕分成十二列看 .col-(xs ...
- 2020.10.17 JZOJ 提高B组T2 导弹拦截
2020.10.17 JZOJ 提高B组T2 导弹拦截 题目 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统. 敌国的导弹形成了立体打击,每个导弹可以抽象成一个三维空间中的 ...
- dubbo源码学习(一)dubbo容器启动流程简略分析
最近在学习dubbo,dubbo的使用感觉非常的简单,方便,基于Spring的容器加载配置文件就能直接搭建起dubbo,之前学习中没有养成记笔记的习惯,时间一久就容易忘记,后期的复习又需要话费较长的时 ...
- PyQt(Python+Qt)学习随笔:树型部件QTreeWidget提供的currentItem当前项操作访问方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 当前项是指当前鼠标和键盘焦点所在项,在项可以进行选择操作时,当前项可以是选中状态,也可以是未选中状态 ...
- Office宏病毒免杀(1)
使用github开源工具EvilClippy进行宏病毒混淆免杀:https://github.com/outflanknl/EvilClippy/releases 注意需要将这两个文件下载在同一个文件 ...
- C#清除HTML标签方法
删除字符串中HTML标签代码 public static string ClearHTMLTags1(string HTML) { string[] Regexs ={ @"<scri ...