最近在幫一個朋友維護PHP網站 以前沒搞過PHP 有一個同步的問題 想問下有經驗的朋友 
簡單的說 PHP server端響應request是可以併發的嗎,還是說必須一個<?php ?>執行完前下一個<?php ?>不能被執行?我希望不是併發的 如果是後者 就不用考慮同步問題了但如果是併發的 ,那麼當我的php在處理一連串操作時 就需要鎖住server不讓其他的php請求執行才可以。比方說Linux Kernel裡頭有spinlock, mutex可以用來實現,但是php中有沒有辦法呢。我希望start to lock the server
do some sql query
do some analyses upon the data
update the sql server
unlock the server在這期間不讓其他php請求執行 直到我完成並unlock server
有辦法嗎

解决方案 »

  1.   

    首先必须要知道:网站都是并发的!
    不要总是把桌面开发的理念硬朝web开发上去套
    其次,网站是为众人服务的
    如果被设计成只能为一个人服务,那么这个网站就没有必要存在了你可以用任何共享资源实现加锁
    任何 php 程序在执行时都去检查是否已被锁定了
      

  2.   

    "你可以用任何共享资源实现加锁"什麼共享資源? 共享變量嗎? 如果兩個PHP請求在同一時刻訪問變量呢?需要有一個類似於kernel中的mutex或者spinlock那樣的原子操作才行。
      

  3.   

    "不要总是把桌面开发的理念硬朝web开发上去套
    其次,网站是为众人服务的
    如果被设计成只能为一个人服务,那么这个网站就没有必要存在了"你沒理解我的意思,我是講的多方請求但是在server端實現queueing, 如果PHP server本身沒有這個機制 那就需要我們自己在PHP程序中實現,我正是在老論這個方法。
      

  4.   

    貌似这里的“并发”概念有点混乱LZ似乎有点不了解脚本语言最简单的一个例子就是批处理(不太懂*nix,就用win的bat说)
    bat里面的事情是依次执行的,之间不是并发
    但多个bat是可以同时执行的,bat与bat之间就是并发,执行体都是cmd.exe对于同一个访问者,总是逐个php执行的,不同页面视为两个无关的php脚本
    对于多个访问者,访问同一个网页(php),是“并发”,但却是由服务器+解析器调度的,不是脚本本身来调度所以php的程序内没必要写什么锁,除非一些高级的IO操作
    至于php.exe是怎样“并发”执行php脚本的,这个完全是web server(如apache)的事很少有跨多人php的变量,多人共同读写的数据,一般都是外部数据源(文件、数据库等),而不是php的全局(服务器级)变量
      

  5.   


    你講對了 我就是需要處理"一些高级的IO操作"
    比方講我先select一批record出來 然後用PHP程序進行分析比較
    分析完成後 用delete刪除當中的一些record如果在我的分析的過程當中 有其他的PHP程序也在操作SQL database,那麼他可能先delete了我想刪除的某個record,這時候等我分析完要進行delete時就會報錯。在Linux kernel以及所有的OS kernel中這種情況下都會用一個atom操作鎖住所需訪問的資源(稱為critical section),不知道PHP程序中需要獨佔MySQL時有沒有類似的辦法呢?
      

  6.   

    对于你描述的应用,mysql 提供了 LOCK TABLES 和 UNLOCK TABLES 命令
    你講對了 我就是需要處理"一些高级的IO操作"
    比方講我先select一批record出來 然後用PHP程序進行分析比較
    分析完成後 用delete刪除當中的一些record如果在我的分析的過程當中 有其他的PHP程序也在操作SQL database,那麼他可能先delete了我想刪除的某個record,這時候等我分析完要進行delete時就會報錯。在Linux kernel以及所有的OS kernel中這種情況下都會用一個atom操作鎖住所需訪問的資源(稱為critical section),不知道PHP程序中需要獨佔MySQL時有沒有類似的辦法呢?
      

  7.   

    利用MySQL的锁定机制来实现,缺点是增大了数据库服务器的连接负担,并且使得程序依赖于数据库服务才能正常工作。
    不放可以试试:
    1)文件锁。
    2)共享内存锁。关键做法可以百度。