比如: www.csdn.net的首页, 假设只有一台web服务器, 其他什么都没有.然后, 服务器正在提供服务, 也就是正在运行中, 对于www.csdn.net/index.html这个页面, 或者对于该域名下任何其他静态页面或者动态页面, 如果想要更新内容, 该怎么发布呢 , 做过的讲一下... 因为web服务器在提供服务, 也许正打开某个页面在读, 也可能某个php正在执行, 怎么保证更新时不引发web服务器发生异常崩掉呢, 我迷惑已久, 彻夜难眠。
调试欢乐多
当然我只是想说这只是本身机制问题
虽然你在 linux 版面获得了不少奖牌,但我依然要说你对操作系统知道的太少
由操作系统调度的文件操作是不会发生读写冲突的,否则就不是操作系统了
你的更新就属于此类一般的说,读写冲突只产生于同一进程中(因为调度由应用程序负责)
php文件更新在读的用户就会有问题了..
更新了一半,代码可能会出错了。动作太大话就要关站一会儿咯,找个夜深人静的时候干。至于内容更新都是数据库了,没这问题。
多进程操作同一文件肯定是乱的呀, 文件内容在某些时间点就是错乱的, 至于unlink掉源文件再rename倒是感觉可行.
所以CSDN就會叫你去玩玩能堅持多久的遊戲,這下知道我上面說的是什麼 了吧。當你在升級某些文檔的時候,最好的做法就是暫停某些服務,等文件全部更新完畢後再開放服務,這樣就僅可能避免出現的衝突等等問題。
多服务器可以在内部DNS改一下就完事了, 批量的更换再重新改过去, 就一台的这种情况是不是无解.
stop 之後 將原來的web目錄換名 使用另外一個目錄 目錄裏只有一個404的文件,就是 玩玩堅持多久...
所有訪問不到的頁面都訪問這個404 不就行了.
有道理, 可以改一下配置文件docment_root,restart httpd, 等换好了再切回来...
不过如果是csdn这种的,前端由CDN和缓存来支持,后端即使更新文件,也不会对前端造成影响,只要届时更新一下cache和CDN即可。
php文件的运行更没有问题,因为要运行要先读取到内存,这时别的进程写硬盘上的文件已无影响.
(大文件即用到内存映射的情况似乎会更复杂一点? 谁熟悉操作系统的麻烦给讲讲?)对很多文件的更新来说,当然会有互相之间的一致性问题,
如果能分批安全更新当然最好,但是有时候很麻烦......
所以如上说,很多时候还是要在别人ML的时候停服务做更新.......IT业公司应该提供一项"ML损失费".....
但是如果你此时刚好在更新文件,恰好PHP又已经读取了前面几个旧版本的文件和刚刚被更新的一个文件,那么就很可能会出问题,说实在的,人多的话单服务器貌似没什么办法做到100%不出问题(PS:原谅我目光狭隘见识短)
不过话说回来,人多的话就不应该是单服务器了运作而是有多个服务器了,这样就可以轮流更新不会出问题了当然了,但服务器如果怕出问题,就显示一个正在更新升级的友好页面吧,很多网站不也是这么做吗?
而修改文件如果出现在更新缓存时肯能会出问题。而如果是静态文件,几率机会为0,除非需编译的脚本更新过程较慢。
一般的做法都是如果是静态,处理较随意。如果是代码肯定选在负载较小的时段,或者前端轮换更新。
如果涉及到整个进程重启等较大变动,就要出通知或提示了。
------一个没研究过源码的猜想一下,呵呵。