比如: www.csdn.net的首页, 假设只有一台web服务器, 其他什么都没有.然后, 服务器正在提供服务, 也就是正在运行中, 对于www.csdn.net/index.html这个页面, 或者对于该域名下任何其他静态页面或者动态页面, 如果想要更新内容, 该怎么发布呢 , 做过的讲一下... 因为web服务器在提供服务, 也许正打开某个页面在读, 也可能某个php正在执行, 怎么保证更新时不引发web服务器发生异常崩掉呢, 我迷惑已久, 彻夜难眠。

解决方案 »

  1.   

    看到lz这么多c++奖牌,不是c++都有线程呀什么的,
    当然我只是想说这只是本身机制问题
      

  2.   

    问题确实有!其实动态文件不存在这个问题! 动态文件超时服务器自返回就行了。连接过多时,服务器自动断开。给一个界面就行了。静态文件会存在这个问题. 更新php文件也会存在这个问题。 就是出错。最可能的办法或是写文件时加锁。 更新文件时,有时读只能读一半的信息。
      

  3.   

    这么多大牛来到php版块。我也迷茫了。。Web服务器好像本身就具备能处理多个请求的功能。现在不是都多线程的了吗。。倒是数据库可能压力大些。读取太频繁了可能导致偶尔连接失败的可能性。
      

  4.   

    显然你所谓的更新是指文件的更新,更新数据库是不会发生读写冲突的
    虽然你在 linux 版面获得了不少奖牌,但我依然要说你对操作系统知道的太少
    由操作系统调度的文件操作是不会发生读写冲突的,否则就不是操作系统了
    你的更新就属于此类一般的说,读写冲突只产生于同一进程中(因为调度由应用程序负责)
      

  5.   

    我怎么看也都觉得他说的是文件更新。
    php文件更新在读的用户就会有问题了..
    更新了一半,代码可能会出错了。动作太大话就要关站一会儿咯,找个夜深人静的时候干。至于内容更新都是数据库了,没这问题。
      

  6.   


    多进程操作同一文件肯定是乱的呀, 文件内容在某些时间点就是错乱的, 至于unlink掉源文件再rename倒是感觉可行.
      

  7.   


    所以CSDN就會叫你去玩玩能堅持多久的遊戲,這下知道我上面說的是什麼 了吧。當你在升級某些文檔的時候,最好的做法就是暫停某些服務,等文件全部更新完畢後再開放服務,這樣就僅可能避免出現的衝突等等問題。
      

  8.   


    多服务器可以在内部DNS改一下就完事了, 批量的更换再重新改过去, 就一台的这种情况是不是无解.
      

  9.   


    stop 之後 將原來的web目錄換名 使用另外一個目錄 目錄裏只有一個404的文件,就是 玩玩堅持多久...
    所有訪問不到的頁面都訪問這個404 不就行了.
      

  10.   


    有道理, 可以改一下配置文件docment_root,restart httpd, 等换好了再切回来...
      

  11.   

    只有一台服务器的话,一般都是需要在短时间内中断业务,停机维护的吧,直接替换文件的瞬间,也是要暂停一瞬间业务的,试试看在一个高并发的接口上替换接口文件,就会发现,error_log里会有很多“Premature end of script headers”的报错。
    不过如果是csdn这种的,前端由CDN和缓存来支持,后端即使更新文件,也不会对前端造成影响,只要届时更新一下cache和CDN即可。
      

  12.   

    记得曾经看到文章说facebook使用P2P来更新前端页面代码, 数千台服务器更新只用12s...顿时惊为天人....如果单台服务器前端也有cache的话, 那也可以安心更新文件了,更新完成刷新cache,或者等cache自动来获取文件就行了。总之针对LZ的疑惑,我能想到的方法,就是无论如何,用户访问到的,都不能是你正在更新,或者更新到一半的代码。
      

  13.   

    对单个文件来说,应该无问题,因为文件操作的读写互斥是由操作系统保证的.
    php文件的运行更没有问题,因为要运行要先读取到内存,这时别的进程写硬盘上的文件已无影响.
    (大文件即用到内存映射的情况似乎会更复杂一点? 谁熟悉操作系统的麻烦给讲讲?)对很多文件的更新来说,当然会有互相之间的一致性问题,
    如果能分批安全更新当然最好,但是有时候很麻烦......
    所以如上说,很多时候还是要在别人ML的时候停服务做更新.......IT业公司应该提供一项"ML损失费".....
      

  14.   

    我觉得你想太多了,懂的东西太多了,反而给限制。。我懂的不多,但我只是知道,服务器内存够,cpu好,带宽充足,网络稳定,就不会出现你说的情况!
      

  15.   

    通常情况下,比如PHP,当有人访问时,会把PHP文件读进内存,这时你对文件怎么修改都没事;
    但是如果你此时刚好在更新文件,恰好PHP又已经读取了前面几个旧版本的文件和刚刚被更新的一个文件,那么就很可能会出问题,说实在的,人多的话单服务器貌似没什么办法做到100%不出问题(PS:原谅我目光狭隘见识短)
    不过话说回来,人多的话就不应该是单服务器了运作而是有多个服务器了,这样就可以轮流更新不会出问题了当然了,但服务器如果怕出问题,就显示一个正在更新升级的友好页面吧,很多网站不也是这么做吗?
      

  16.   

    我依稀记得一般的web服务器,都默认有文件缓存副本功能的,也就是被解析或访问过的都会被webhost缓存。
    而修改文件如果出现在更新缓存时肯能会出问题。而如果是静态文件,几率机会为0,除非需编译的脚本更新过程较慢。
    一般的做法都是如果是静态,处理较随意。如果是代码肯定选在负载较小的时段,或者前端轮换更新。
    如果涉及到整个进程重启等较大变动,就要出通知或提示了。
      

  17.   

    这个应该不会崩溃吧?一个web请求应该就是一个线程,要崩溃应该只是线程崩溃,不会导致整个服务崩溃,这个应该有保护措施吧。
                      ------一个没研究过源码的猜想一下,呵呵。