标题
服务器之王! [坛主CLQ的服务器程序开发日记,综合了众多C/C++程序崩溃的原因,强烈推荐!]
我是马甲
以 CGI 方式运行 PHP 的原因
以CGI方式執行PHP程式(可達成同時執行PHP4及PHP5)
雷電HTTPD Web Server預設是以ISAPI方式執行PHP的程式,那是否有方式能夠透過CGI的方式執行呢? 答案是有的,但為什麼要透過CGI方式執行呢? ISAPI不是比較強比較快嗎?那又何必須要CGI呢?
這個問題我們目前想到了兩種答案,提供一點心得。
可能性一:同時想要執行PHP4及PHP5,基本上ISAPI或者是APACHE MODULE版本的PHP,他的PHP.INI都是放置於WINDOWS的系統目錄當中,而PHP5與PHP4的PHP.INI又不盡相同,基本上就否定了同時執行兩套版本之PHP ISAPI的可能性,但若又有同時要跑PHP4與PHP5的需求,即可將ISAPI的PHP跑PHP5而CGI的PHP跑PHP4來達成,因為CGI版本的PHP讀取的是與PHP.EXE相同目錄中的PHP.INI,自然不與ISAPI版本相衝突。
可能性二:規避PHP ISAPI的當機狀況,誰說PHP是完美的? 沒有錯,PHP也會當機,而且由於ISAPI版本的PHP DLL檔案載入記憶體後就不會被卸載,除非系統重新啟動,因此當PHP ISAPI子系統發生當機時,便會造成Web Server無法繼續提供PHP解譯的機能。然而CGI版本的PHP.EXE乃獨立於伺服器程式行程(Process)之外的獨立程式,雖然啟動所花的時間較長,但若當機也是該行程自己當掉而已,並不會影響到其他的PHP執行。
設定方式:
首先我們假設您預設安裝為PHP5 ISAPI版本的雷電HTTPD,因此我們要嘗試將PHP4版本的PHP也安裝為CGI的方式執行,並且對映到 *.php4 的副檔名。
於工作列滑鼠右鍵點選雷電HTTPD圖示,選設定...後進入設定畫面: 這邊可以看到 php isapi dll 使用為 php5isapi.dll 表示目前 php 執行的是 PHP4 ISAPU 版本。
點選虛擬主機編輯器: 首先假設你已經把 PHP4 解壓縮到 c:\php 的目錄當中,並且正確的設定了 c:\php\php.ini,這邊我們啟用CGI2處理器,並且將其處理器路徑設為 c:/php/php.exe,注意下面 CGI文件2 要將 .php4 加入,這樣子在瀏覽器存取帶有 *.php4 附檔名的 URL 時,PHP4的CGI處理器就會被利用到。
clq
现在的网络攻击真是猖獗啊,我就懒了那么一点点 :)
clq
惭愧,计算小数点居然失误,分母计算成了 n*10 ,其实应该是 10^n 才对.
--------------------------------------------------
10的N次方 请问用C++符号怎么表示呀 谢谢 急
楼主waini11(王子)2004-09-01 10:20:44 在 C/C++ / C++ 语言 提问
如题目 10^n 这样可以吗?
问题点数:20、回复次数:5
Top
1 楼xteaj(半桶水)
回复于 2004-09-01 10:23:44 得分 3
1e5表示10^5
5 楼Squall1009(钰枫)(找工作ing)
回复于 2004-09-01 10:46:10 得分 4
pow(x, y)是计算x的y次方
注意,pow是库函数,必须包含#include 哟.
clq
删除一个指针后,应当总将其手工设置为 NULL(空) .要不一个指针在哪怎么知道它是无效的呢,在VC下还有些异常提示,不知 gcc 有没有? 如果没有呢则是非常可怕的事情,而且自己设置为空,在调试时也很容易发现哪个指针无效了.
另外象
void clear(XX * p)
{
..
p = NULL;
..
}
..
..
clear(p);
这样的代码中, clear(p) 后 P 的值是不会变为空的,因为函数中的指针值是传不出来的.它改变的是指针指向的内容,它是改变不了指针本身的.(问题:如何在一个函数中改变指针本身?好象没有办法?)
我是马甲
select 又用错了,我真是不长记性呀。
bool base_socket::can_send()
{
struct timeval l_timeout ;
fd_set fd_write ;
FD_ZERO(&fd_write);
FD_SET(this->socket_handle, &fd_write);
l_timeout.tv_sec = timeout;
l_timeout.tv_usec = 0;
//linux 第一个参数一定要赋值//int r = ::select(0, NULL, &fd_write, NULL, &l_timeout);
int r = ::select(this->socket_handle+1, NULL, &fd_write, NULL, &l_timeout);
if(r <= 0)//超时了
{
return false;
}
return true;
}
我是马甲
"
setsockopt(CreateSock,SOL_SOCKET,SO_REUSEADDR,(LPSTR)&dwFlag,sizeof(dwFlag));说明
如果是TRUE,套接字就可以与一个其他套接字使用的地址绑定在一起,或者与处于TIME_WAIT状态的 地址绑定在一起。
默认情况下,套接字不同一个正在使用的本地地址绑定在一起。但是少数情况下,还是需要使用这种方式,来实现对一个地址的重复使用。两个独立的套接字不可与同一本地接口(在TCP/IP情况下,则是端口)绑定在一起,以等待进入的连接通知。在TCP环境中,假如服务器关闭,或者异常退出,造成本地地址和端口均进入TIMP_WAIT状态,那么SO_REUSEADDR这个套接字选项便十分有用了。在TIME_WAIT状态下,其他任何套接字都不能与那个地址绑定到一起。但设置了这个套接字,服务器便可在重新启动之后,在相同的本地接口以端口上进行监听。
"
clq
在Linux程序中如何获得本进程的可执行文件的全路径?象win SDK GetModuleFile一样.
google 了一下居然发现没有直接的方法。有人说用 getcwd ,我觉得危险性太大,还不如我现在用的 argv[0] .至于说读 proc 文件,我觉得基本上是胡来。
clq
今天看了 alloc 函数,突然想起可以写一个在函数退出时自动 free 的 malloc 类嘛。
clq
有一个服务器老退出,修正了很多地方仍然有.最后定位了经常发生在访问 ado 连接 sql server 之时,百思不得其解决. 这个框架用在别的地方可是稳定得不得了的啊,最后定位在 ado 线程模型上(因为这是它与别的服务器最大的区别).发现确实有问题,多线程下应该用 CoInitializeEx( NULL, COINIT_APARTMENTTHREADED ) ,而不是默认的CoInitialize( NULL ) .
这个 CoInitializeEx 还真不好调用,必须定义有 _WIN32_DCOM 的情况下才能使用,而且据说还要在某个头文件之前,我试了一下不行,直接在工程文件中定义了.
剩下的问题是,这之前它一直很稳定呀.是用的人多起来了才冲突?还是操作系统升级后检测更严格了?总之,下次这里再崩溃俺就加锁,再不行用 delphi 专门写一个ado访问服务器好了.
--------------------------------------------------
//CoInitialize(NULL);//test//CoInitialize( NULL ) 等于 CoInitializeEx( NULL, COINIT_APARTMENTTHREADED )
CoInitializeEx(NULL, COINIT_MULTITHREADED);//与上一个有什么区别?//注意调用这个函数要在编译中定义 _WIN32_DCOM
//#define _WIN32_DCOM//不能写在这里,要写在编译器的工程文件中
我是马甲
不行,ado的线程还是不安全的,即使用了它声明为线程安全的方式.直接做成一个 exe 调用好了 -- 象 cgi 一样.
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.