mysql触发PHP问题 现在有需求是这样的,mysql数据库的一个提定的数据只要一改变,就触发一个PHP程式,怎么实现啊? 谢谢~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 老大,那有什么折中的办法吗?如果数据库中某个字段一改变,想通过socket自动的对应的信息给用户 只能在 mysql 的触发器中对一过渡表写入相关信息检查过渡表的变化只能是php轮询了,不过过渡表很小,应该影响不大 能否借助C写的存储过程?思路如下:1、借助触发器机制,触发某个存储过程;2、该存储过程调用一个C写的存储过程;3、C写的存储过程再以CGI方式调用PHP脚本。没试过,应该可以的吧。 那是不是只有通过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); 这个需求是个增量模型,用数据库作为存储介质本来就不合适,大材小用了。如果消息是递增的,直接追加写文件即可,需要一个文件专门存消息号,操作消息文件前前锁消息号文件,消息号+1,然后将消息追加到消息文件,最后放掉锁。 客户端AJAX维护好自己的上次请求得到的最大消息号即可。轮询就是肯定的,HTTP没有真正的推,AJAX长连接浮云。 谢谢,在我上面socket服务端的代码中1.socket服务端程式把所有连接的客户端的数据(IP:PORT)是存在数据库好,还是存在文件中好啊。?因为客户端连接服务器是经常在变动的~2.比如:A用户发送到SOCKET服务端中的字符串中包含B用户ID,服务端接受到A的信息后,在上一题中的存储文件中找到B用户的ID,服务器SOCKET怎么通知B用户啊,是用socket_sendto 吗?我上面的socket程序要怎么写啊?感谢!! 谢谢。具体如下:A,B用户在使用同一款android软件,A,B都在数据库中有存socket连接的IP与端口A通过socket发到服务器请求与B连接,B怎么知道有这个请求呢?于是我想,A发请求的时候带上B的ID,服务器端接收到ID时,通过ID找到数据库中B的IP与端口,服务器端SOCKET通过IP与端口再发送TRUE字符到B,B客户端接收到了这个字符,就触发android程式进行连接~现在问题是上面红色字体怎么实现啊?不知道有没有描述清楚~~ 嗯,不了解android,不过,怎样也不应该需要mysql来触发啊 PHP php 收邮件. PHP构造函数 php处理字符串的问题 在线急求高手们解答小问题 谢谢 关于引号问题 我帮朋友做滴网站,大家看看速度如何~~~ 考勤的半天问题 PHP文件目录操作问题 ODBC+PHP的问题,急!! 国内学习PHP的资源站点有哪些? php addslashes在什么地方用,为什么?
那有什么折中的办法吗?
如果数据库中某个字段一改变,想通过socket自动的对应的信息给用户
检查过渡表的变化只能是php轮询了,不过过渡表很小,应该影响不大
思路如下:
1、借助触发器机制,触发某个存储过程;
2、该存储过程调用一个C写的存储过程;
3、C写的存储过程再以CGI方式调用PHP脚本。
没试过,应该可以的吧。
当数据库中的提定的数据改变时,想做的是用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);
1.socket服务端程式把所有连接的客户端的数据(IP:PORT)是存在数据库好,还是存在文件中好啊。?因为客户端连接服务器是经常在变动的~2.比如:A用户发送到SOCKET服务端中的字符串中包含B用户ID,服务端接受到A的信息后,在上一题中的存储文件中找到B用户的ID,服务器SOCKET怎么通知B用户啊,是用socket_sendto 吗?我上面的socket程序要怎么写啊?感谢!!
具体如下:A,B用户在使用同一款android软件,
A,B都在数据库中有存socket连接的IP与端口
A通过socket发到服务器请求与B连接,B怎么知道有这个请求呢?于是我想,A发请求的时候带上B的ID,服务器端接收到ID时,通过ID找到数据库中B的IP与端口,服务器端SOCKET通过IP与端口再发送TRUE字符到B,B客户端接收到了这个字符,就触发android程式进行连接~现在问题是上面红色字体怎么实现啊?不知道有没有描述清楚~~
不过,怎样也不应该需要mysql来触发啊