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

相關文章
相關標籤/搜索