现在有需求是这样的,
mysql数据库的一个提定的数据只要一改变,就触发一个PHP程式,怎么实现啊? 谢谢~

解决方案 »

  1.   

    老大,
    那有什么折中的办法吗?
    如果数据库中某个字段一改变,想通过socket自动的对应的信息给用户
      

  2.   

    只能在 mysql 的触发器中对一过渡表写入相关信息
    检查过渡表的变化只能是php轮询了,不过过渡表很小,应该影响不大
      

  3.   

    能否借助C写的存储过程?
    思路如下:
    1、借助触发器机制,触发某个存储过程;
    2、该存储过程调用一个C写的存储过程;
    3、C写的存储过程再以CGI方式调用PHP脚本。
    没试过,应该可以的吧。
      

  4.   

    那是不是只有通过crontab计划任务来完成吗?但是crontab最低只能侦测一分钟的啊。可能是我的想法错了。?
    当数据库中的提定的数据改变时,想做的是用socket给用户(手机)端自动发一个数据,不知道怎么实现的好,
    下面是我从网上抄别人的socket程式:
    server.php$addr = "192.168.1.121";
    $port = 1338;$remoteIP = "";
    $remotePort = "";$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
    if($socket < 0) {
            echo "Socket create:".$socket_strerror($socket)."\n";
            exit;
    }
    if ( ($ret = socket_bind($socket, $addr, $port)) < 0 ) {
        echo "socket bind:".socket_strerror()."\n";
        exit;
    }
    if ( ($ret = socket_listen($socket, 5)) < 0 ) {
        echo "socket listen:".socket_strerror()."\n";
        exit;
    }socket_set_nonblock($socket);echo "Wainting for a connection:\n";$clients = array($socket);
    while(true) {
        $read = $clients;
        if(socket_select($read, $writes=NULL, $execs=NULL, 3) < 1){
            //echo ".";
            continue;
        }    if(in_array($socket,$read)) {
            $clients[] = $newsock = socket_accept($socket);
            socket_set_nonblock($newsock);
            socket_getpeername($newsock,&$remoteIP,&$remotePort);        
            $key = array_search($socket,$read);
            unset($read[$key]);
            $msg = "Server: $addr\r\n".
                    "Notice:Welcome the user from ".$remoteIP.":".$remotePort.".\r\n";
            echo $remoteIP.":".$remotePort." conected in.\r\n";
            socket_write($newsock,$msg);
        }    foreach($read as $read_sock) {
            $data = @socket_read($read_sock,1024,PHP_BINARY_READ);
            if($data == false) {
                $key = array_search($read_sock,$clients);
                print_r($clients[$key]);
                unset($clients[$key]);
                socket_close($read_sock);
                echo "Client disconnected.\n";
                continue;
            }
            
            $command = strtoupper ($data);
            
            switch ($command)
            {
                case "LIST":
                    $writer = print_r($clients,1);
                    break;
                case "HELLO":
                    $writer = "Hello Everybody!";
                    break;
                case "QUIT":
                    $writer = "Bye-Bye";
                    break;
                case "SLEEP":
                    sleep(30);
                    $writer = "sleeped 10 seconds!";
                    break;
                case "HELP":
                    $writer = "HELLO\tQUIT\tHELP";
                    break;
                default:
                    $writer = "Error Command!\r\nType help for help message!";
            }        socket_write($read_sock, $writer);
            //exit;
        }
    }
    socket_close($socket);
    测试端:// Client  
     // 设置错误处理 
     error_reporting (E_ALL); 
     // 设置处理时间 
     set_time_limit (0); 
      
     $ip = "192.168.1.121";       // IP 地址 
     $port = 1338;            // 端口号 
      
     $socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP);   // 创建一个SOCKET 
     if ($socket) 
         echo "socket_create() successed!\n"; 
     else 
         echo "socket_create() failed:".socket_strerror ($socket)."\n"; 
      
     $conn = socket_connect ($socket, $ip, $port);       // 建立SOCKET的连接 
     if ($conn) 
         echo "Success to connection![".$ip.":".$port."]\n"; 
     else 
         echo "socket_connect() failed:".socket_strerror ($conn)."\n"; 
      
     echo socket_read ($socket, 1024);    
      
     $stdin = fopen ('php://stdin', 'r'); 
     while (true) 
     { 
         $command = trim (fgets ($stdin, 1024)); 
         socket_write ($socket, $command, strlen ($command)); 
         $msg = trim (socket_read ($socket, 1024)); 
         echo $msg."\n"; 
         if ($msg == "Bye-Bye") 
             break; 
     } 
     fclose ($stdin); 
     socket_close ($socket); 
      

  5.   

    这个需求是个增量模型,用数据库作为存储介质本来就不合适,大材小用了。如果消息是递增的,直接追加写文件即可,需要一个文件专门存消息号,操作消息文件前前锁消息号文件,消息号+1,然后将消息追加到消息文件,最后放掉锁。 客户端AJAX维护好自己的上次请求得到的最大消息号即可。轮询就是肯定的,HTTP没有真正的推,AJAX长连接浮云。
      

  6.   

    谢谢,在我上面socket服务端的代码中
    1.socket服务端程式把所有连接的客户端的数据(IP:PORT)是存在数据库好,还是存在文件中好啊。?因为客户端连接服务器是经常在变动的~2.比如:A用户发送到SOCKET服务端中的字符串中包含B用户ID,服务端接受到A的信息后,在上一题中的存储文件中找到B用户的ID,服务器SOCKET怎么通知B用户啊,是用socket_sendto 吗?我上面的socket程序要怎么写啊?感谢!!
      

  7.   

    谢谢。
    具体如下:A,B用户在使用同一款android软件,
    A,B都在数据库中有存socket连接的IP与端口
    A通过socket发到服务器请求与B连接,B怎么知道有这个请求呢?于是我想,A发请求的时候带上B的ID,服务器端接收到ID时,通过ID找到数据库中B的IP与端口,服务器端SOCKET通过IP与端口再发送TRUE字符到B,B客户端接收到了这个字符,就触发android程式进行连接~现在问题是上面红色字体怎么实现啊?不知道有没有描述清楚~~
      

  8.   

    嗯,不了解android,
    不过,怎样也不应该需要mysql来触发啊