如题:
程序做好,server.php 部署在个人电脑当服务器(win7+apache2.2+mysql+php5.2),客户端是一个单片机,每隔3秒发送给我一个信号包,我接收后保存到mysql一个表中。发现每次我打开server.php后,能正常接收信号,并且保存到数据库中,但是过了大概30秒,发现数据不保存了,一查,连端口也被关掉了,不知道是什么原因?cpu消耗查看了没问题,难道是因为内存?还是因为防火墙?向各位大神们求救!!
server.php代码如下:<?php
include 'conn.php';
//error_reporting( E_ALL );
set_time_limit( 0 );
ob_implicit_flush();
$socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
if ( $socket === false ) {
    echo "socket_create() failed:reason:" . socket_strerror( socket_last_error() ) . "\n";
}
$ok = socket_bind( $socket, '0.0.0.0', 11211 );
if ( $ok === false ) {
    echo "socket_bind() failed:reason:" . socket_strerror( socket_last_error( $socket ) );
}
while ( true ) {    $from = "";
    $port = 0;
    socket_recvfrom( $socket, $buf,1024, 0, $from, $port );

    echo $buf;
//插入数据库
if (strlen($buf)>10){
date_default_timezone_set('PRC');
$lasttime=date("Y-m-d H:i:s");
$sql = "insert into users(lastname,lasttime) values('$buf','$lasttime')";
$result = @mysql_query($sql);
echo "-----------------------";
}
    usleep( 1000 );
}
?>

解决方案 »

  1.   

    对了,补充下,因为 server.php一直忙碌,我一般是打开15秒后就把这个网页关闭的,但是依然可以接收信号,但……30秒后就不接收了,而且端口也被关停,httpd.exe进程也停止了。
      

  2.   

    php是服务端脚步 不支持多线程
    粗略扫了一眼代码 你这代码应该是从网上搜索到的吧 应该没什么问题(我没有调试,不敢保证)所以我猜会不会是客户端有并发数据产生? 发送到了11211端口
    现在这个代码是不支持并发的所以我担心是这里出了问题对了,补充下
    1. socket_recvfrom函数是阻塞的 后面的usleep应该没啥必要
    2.既然这个程序调用了set_time_limit(0), 代表这个页面一旦被请求将一直被执行到结束 不再受默认30s的时间限制
      所以你在浏览器中是否关闭这个网页已经没所谓了 这个程序一旦被启动 将一直执行 直到httpd停止希望这些能给你排查问题带来点方向
      

  3.   

    你的代码没有问题,但架构是 demo 型的(供学习用的范例代码)。
    30秒后自动关闭的原因是你的程序运行在 web 方式下
    在 CLI(命令行)方式下就没有这个限制了
      

  4.   

    用cli模式试试。
      

  5.   

    多谢3位大侠,尤其还有两位是“版主”啊!!惊喜;
    追问:能否把cli模式如何操作说详细点?我应该怎么改呢?在服务器上做一个.bat文件执行?还是干脆做一个c#本地客户端执行?要考虑多线程么?我确实是半桶水,请教更详细的解答,万分感谢!期待中……
      

  6.   

    做一个.bat文件执行,可以
    php_win.exe code.php用 C# 当然更好啦也可以用 WinBinder 2010 写成 桌面程序 或 Tray 程序
      

  7.   

    ***************************************************************************
    追问:php_win.exe code.php 是什么意思? 是在.bat里面的语句么?你指的code.php是否就是我上面的那段代码文件server.php?可以直接用么?求详解。
      

  8.   

    对!(没注意你写了文件名 server.php)注意 php 的路径,你应该知道的
    CLI 方式方式下 php.ini 的搜索路径是:
    程序文件所在目录
    php-win.exe 所在目录也可以用 php.exe、php_cgi.exe、php_cli.exe 但他们多半会出现命令窗口,有碍观瞻
      

  9.   

    php-win.exe D:\PHPnow\htdocs\toolsudp\server.php  
    我写了一个bat文件,就是单独以上一句,执行没有反应啊? 又改成 
    D:\PHPnow\php-5.2.14-Win32\php-win.exe D:\PHPnow\htdocs\toolsudp\server.php  也没反应啊?路径的大小写我都查了。什么原因呢? 检查我的 php服务器发现 起作用的不是 php.ini 而似乎是 php-apache2handler.ini 不知是否有影响?
      

  10.   

    不要管服务器,本来命令行方式运行时的 php.ini 就该和 web 方式的不一样。需求不同,配置也应不同
    就算是要相同的配置,你也是复制 php-apache2handler.ini 到 D:\PHPnow\php-5.2.14-Win32\ 并改名为 php.ini
      

  11.   

    1然后我干脆在桌面的开始命令行输入 cmd,打开dos窗口 
    1、输入
    php-win.exe D:\PHPnow\htdocs\toolsudp\server.php                提示我 php-win.exe不是内部或外部命令;2、转到D目录输入
    D:\PHPnow\php-5.2.14-Win32\php-win.exe D:\PHPnow\htdocs\toolsudp\server.php     没有任何反应3、输入
    D:\PHPnow\php-5.2.14-Win32\php.exe D:\PHPnow\htdocs\toolsudp\server.php    (改用php.exe)提示我:PHP Warning:
    PHP Startup:Unable to load dynamic library  './php_gd2.dll' -找不到指定的模块。In unknow line 0
    PHP Warning:PHP Startup:Unable to load dynamic library  './php_mysqli.dll' -找不到指定的模块。In unknow line 0求解!!!
      

  12.   

    php-win.exe 你需要用完整目录。例如: c:\xxxx\php-win.exe D:\PHPnow\htdocs\toolsudp\server.ph
      

  13.   

    *********************************************************************************
    追问:
    D:\PHPnow\php-5.2.14-Win32\php-win.exe  这是我的php文件夹中的目录,我尝试了还是没反应?