PHP 自动加载对象(以MVC框架为例)
2023-09-14 08:59:47 时间
public function __construct() {
spl_autoload_register ( array ($this, model ) );
spl_autoload_register ( array ($this, helper ) );
spl_autoload_register ( array ($this, controller ) );
spl_autoload_register ( array ($this, library ) );
}
public function library($class) {
set_include_path ( get_include_path () . PATH_SEPARATOR . /lib/ );
spl_autoload_extensions ( .library.php );
spl_autoload ( $class );
}
public function controller($class) {
$class = preg_replace ( /_controller$/ui, , $class );
set_include_path ( get_include_path () . PATH_SEPARATOR . /controller/ );
spl_autoload_extensions ( .controller.php );
spl_autoload ( $class );
}
public function model($class) {
$class = preg_replace ( /_model$/ui, , $class );
set_include_path ( get_include_path () . PATH_SEPARATOR . /model/ );
spl_autoload_extensions ( .model.php );
spl_autoload ( $class );
}
public function helper($class) {
$class = preg_replace ( /_helper$/ui, , $class );
set_include_path ( get_include_path () . PATH_SEPARATOR . /helper/ );
spl_autoload_extensions ( .helper.php );
spl_autoload ( $class );
}
//call
autoloader::init ();
* $Header: /PHPMVC/phpmvc-base/WEB-INF/classes/phpmvc/utils/ClassPath.php,v 1.4 2006/02/22 07:18:26 who Exp $ * $Revision: 1.4 $ * $Date: 2006/02/22 07:18:26 $ class ClassPath { // ----- Depreciated ---------------------------------------------------- // /** * p Setup the application class paths (PHP include_path) for the included * class files, for the duration of the main script /p * * p Returns the class path string for testing purposes * * @depreciated * @param string The appServerRootDir. eg: C:/Www/phpmvc * @param array An array of sub-application paths, br * eg: $subAppPaths[] = WEB-INF/classes/example;, ... * @param string The OS [Optional] [UNIX|WINDOWS|MAC|...] if we have * trouble detecting the server OS type. Eg: path errors. * @public * @returns string */ function setClassPath($appServerRootDir=, $subAppPaths=, $osType=) { // Set AppServer root manually for now if($appServerRootDir == ) { echo Error: ClassPath :- No php.MVC application root directory specified; exit; } #$_ENV; // PHP Superglobals !! // Setup the main phpmvc application include() directories here // Note: could be placed in a n xml config file later !! $appDirs = array(); $appDirs[] = ; // application root directory $appDirs[] = lib; // Add the sub-application paths, if any if(is_array($subAppPaths)) { $appDirs = array_merge($appDirs, $subAppPaths); } // Setup the platform specific path delimiter character $delim = NULL; // path delimiter character. (Windows, Unix, Mac!!) $winDir = NULL; if( (int)phpversion() 4 ) { // PHP 5 $winDir = $_ENV["windir"]; // See: PHP v.4.1.0 Superglobals } else { // PHP 4 global $HTTP_ENV_VARS; // depreciated- if( array_key_exists("windir", $HTTP_ENV_VARS) ) { $winDir = $HTTP_ENV_VARS["windir"]; // will be replaced with $_ENV } } if($osType != ) { if( eregi("WINDOWS", $osType) ) { $delim = ;; // Windows } elseif( eregi("UNIX", $osType) ) { $delim = :; // Unix } elseif( eregi("MAC", $osType) ) { $delim = :; // Mac !!!!! } } if($delim == NULL) { if( eregi("WIN", $winDir) ) { // _ENV["C:\\Win2K"] $delim = ;; // Windows } else { $delim = :; // Unix, Mac !! } } // Get the current working directory $path = $appServerRootDir; // Strip path directories below WEB-INF $pathToWebInf = ereg_replace("WEB-INF.*$", , $path); // Replace path backslashes with forward slashes // Note: PHP Regular Expressions do not work with backslashes $pathToWebInf = str_replace("\\", "/", $pathToWebInf); // Drop the trailing slash, if one is present $pathToWebInf = ereg_replace("/$", , $pathToWebInf); // Setup the environment path string $classPath = NULL; foreach($appDirs as $appDir) { $classPath .= $pathToWebInf./.$appDir.$delim; } // Remove trailing delimiter character $classPath = substr($classPath, 0, -1); // Setup the include_path for the duration of the main php.MVC script ini_set(include_path, $classPath); return $classPath; // for testing } // ----- Public Methods ------------------------------------------------- // function getClassPath($appServerRootDir=, $appDirs, $osType=) { // Set AppServer root manually for now if($appServerRootDir == ) { echo Error: ClassPath :- No php.MVC application root directory specified; exit; } #$_ENV; // PHP Superglobals !! // Setup the platform specific path delimiter character $delim = NULL; // path delimiter character. (Windows, Unix, Mac!!) if($osType == ) { // PHPs build in constant "PATH_SEPARATOR" [unix (:) / win (;)] $delim = PATH_SEPARATOR; } else { // It is handy to be able to specift the OS type for testing $delim = ClassPath::getPathDelimiter($osType); } // Get the current working directory $path = $appServerRootDir; // Strip path directories below WEB-INF $pathToWebInf = ereg_replace("WEB-INF.*$", , $path); // Replace path backslashes with forward slashes // Note: PHP Regular Expressions do not work with backslashes $pathToWebInf = str_replace("\\", "/", $pathToWebInf); // Drop the trailing slash, if one is present $pathToWebInf = ereg_replace("/$", , $pathToWebInf); // Setup the environment path string $classPath = NULL; $AbsolutePath = False; // Say: "/Some/Unix/Path/" or "D:\Some\Win\Path" foreach($appDirs as $appDir) { // Check if the specified system path is an absolute path. Absolute system // paths start with a "/" on Unix, and "Ch\:" or "Ch/:" on Win 32. // Eg: "/Some/Unix/Path/" or "D:\Some\Win\Path" or "D:/Some/Win/Path". $AbsolutePath = ClassPath::absolutePath($appDir); if($AbsolutePath == True) { $classPath .= $appDir.$delim; } else { $classPath .= $pathToWebInf./.$appDir.$delim; } } // Remove trailing delimiter character $classPath = substr($classPath, 0, -1); return $classPath; // for testing } /** * Concatenate environment path strings * p * Returns the two path strings joined with the correct environment * string delimiter for the host operating system. * * @param string The path string * @param string The path string * @param string The operating type [optional] * @public * @returns string */ function concatPaths($path1, $path2, $osType=) { // Setup the platform specific path delimiter character $delim = NULL; // path delimiter character. (Windows, Unix, Mac!!) $delim = ClassPath::getPathDelimiter($osType); $path = $path1 . $delim . $path2; return $path; } // ----- Protected Methods ---------------------------------------------- // /** * Get environment path delimiter. * p * Returns the environment string delimiter for the host operating system. * * @param string The operating type [optional] * @protected * @returns string */ function getPathDelimiter($osType=) { // Setup the platform specific path delimiter character $delim = NULL; // path delimiter character. (Windows, Unix, Mac!!) $winDir = NULL; if( (int)phpversion() 4 ) { // PHP 5 $winDir = $_ENV["windir"]; // See: PHP v.4.1.0 Superglobals } else { // PHP 4 global $HTTP_ENV_VARS; // depreciated- if( array_key_exists("windir", $HTTP_ENV_VARS) ) { $winDir = $HTTP_ENV_VARS["windir"]; // will be replaced with $_ENV } } if($osType != ) { if( eregi("WINDOWS", $osType) ) { $delim = ;; // Windows } elseif( eregi("UNIX", $osType) ) { $delim = :; // Unix } elseif( eregi("MAC", $osType) ) { $delim = :; // Mac !!!!! } } if($delim == NULL) { if( eregi("WIN", $winDir) ) { // _ENV["C:\\Win2K"] $delim = ;; // Windows } else { $delim = :; // Unix, Mac !! } } return $delim; } /** * Check if the specified system path is an absolute path. Absolute system * paths start with a "/" on Unix, and "Ch\:" or "Ch/:" on Win 32. * Eg: "/Some/Unix/Path/" or "D:\Some\Win\Path" or "D:/Some/Win/Path". * * Returns True if the suppplied path absolute, otherwise returns False * * @param string The path to check, like: "/Some/Unix/Path/" or * "D:\Some\Win\Path". * @public * @returns boolean */ function absolutePath($systemPath) { // Say: "/Some/Unix/Path/" or "D:\Some\Win\Path" or "D:/Some/Win/Path" $fAbsolutePath = False; // Boolean flag value //"[/]Some/Unix/Path/" if (preg_match("/^\//", $systemPath)) { $fAbsolutePath = True; //"[D:\]Some\Win\Path" // "i" says "ignore case" // Note the extra escape "\" reqd for this to work with PHP !!! } elseif(preg_match("/^[a-z]:\\\/i", $systemPath)) { $fAbsolutePath = True; //"[D:/]Some/Win/Path" } elseif(preg_match("/^[a-z]:\//i", $systemPath)) { $fAbsolutePath = True; } return $fAbsolutePath; }
* ==================================================================== * The module paths * @author John C Wildenauer * @version * @public class ModulePaths { /** * Return an array of global paths * * @public * @returns array */ function getModulePaths() { // Setup the main module include() directories here // Note: could be placed in an xml config file later !! $appDirs = array(); $appDirs[] = ; // starting with the sub-application home directory $appDirs[] = login; $appDirs[] = login/classes; $appDirs[] = login/tpl; $appDirs[] = project; $appDirs[] = project/classes; $appDirs[] = project/tpl; return $appDirs; }
// Set the application path $moduleRootDir = D:/workspace/eh_plat_wms/dev_src; // no trailing slash // Set the OS Type [Optional] [UNIX|WINDOWS|MAC] if we have // trouble detecting the server OS type. Eg: path errors. $osType = WINDOWS; // Setup application class paths first include lib/ClassPath.php; // Setup the module paths include config/ModulePaths.php; $modulePaths = ModulePaths::getModulePaths(); $mPath = ClassPath::getClassPath($moduleRootDir,$modulePaths, $osType); // Retrieve and merge the php.ini path settings $iniPath = ini_get(include_path); $cPath = ClassPath::concatPaths($mPath, $iniPath, $osType); echo $cPath; // And set the include_path variables, as used by the file functions ini_set(include_path, $cPath);
框架外的PHP读取.env文件(php5.6、7.3可用版) 背景:由于项目需要,在框架外(public文件夹下)新建了一个原生的php文件,由于不知道怎么解决。只需要在宝塔上的php相应的版本上把禁用函数去除即可。其他的参数自己根据代码获取,代码简单,自己读吧。“框架外的php文件,怎么使用DB操作”(我的环境 nginx php7,3)于是上网搜索了一早上也没能又方法。于是我使用了,原生连接方法。index.php文件。这里如果出现这样的问题。............
PHP+Laravel框架RabbitMQ简单使用(路由模式) 一、简介 路由模式跟发布订阅模式类似,然后在订阅模式的基础上加上了类型,订阅模式是分发到所有绑定到交换机的队列,路由模式只分发到绑定在交换机上面指定路由键的队列
PHP+Laravel框架RabbitMQ简单使用(Pub/Sub模式) 一、简介 publish-and- subscribe, 即发布订阅模型。在Pub/Sub模型中,生产者将消息发布到一个主题(Topic)中,订阅了该Topic的所有下游消费者,都可以接收到这条消息。 每个消息可以有多个订阅者; 客户端只有订阅后才能接收到消息; 持久订阅和非持久订阅。 发布者和订阅者有时间依赖:接受者和发布者只有建立订阅关系才能收到消息; 持久订阅:订阅关系建立后,消息就不会消失,不管订阅者是否都在线; 非持久订阅:订阅者为了接受消息,必须一直在线。 当只有一个订阅者时约等于点对点模式
PHP+Laravel框架RabbitMQ简单使用(工作队列模式(竞争消费者模式)) 工作模式:一个消息生产者,一个交换器,一个消息队列,多个消费者。同样也称为点对点模式 假如我们拥有两个消费者,默认情况下,RabbitMQ 将按顺序将每条消息发送给下一个消费者,平均而言,每个消费者将获得相同数量的消息,这种分发消息的方式称为轮询。 假如有一些非常耗时的任务,某个消费者在缓慢地进行处理,而另一个消费者则空闲,显然是非常消耗资源的。
2.其中 spl_autoload_register() 用来注册一个自动调用的函数, 可以注册多个函数!
3.$iniPath = ini_get(include_path);ini_set(include_path, $iniPath. . $cPath);通过设置环境变量来达到autoload目的,设置包含路径,以后可以直接包含这些目录中的文件,不需要再写详细的路径了。方法三取自php.MVC,使用参照php.MVC文档
* $Header: /PHPMVC/phpmvc-base/WEB-INF/classes/phpmvc/utils/ClassPath.php,v 1.4 2006/02/22 07:18:26 who Exp $ * $Revision: 1.4 $ * $Date: 2006/02/22 07:18:26 $ class ClassPath { // ----- Depreciated ---------------------------------------------------- // /** * p Setup the application class paths (PHP include_path) for the included * class files, for the duration of the main script /p * * p Returns the class path string for testing purposes * * @depreciated * @param string The appServerRootDir. eg: C:/Www/phpmvc * @param array An array of sub-application paths, br * eg: $subAppPaths[] = WEB-INF/classes/example;, ... * @param string The OS [Optional] [UNIX|WINDOWS|MAC|...] if we have * trouble detecting the server OS type. Eg: path errors. * @public * @returns string */ function setClassPath($appServerRootDir=, $subAppPaths=, $osType=) { // Set AppServer root manually for now if($appServerRootDir == ) { echo Error: ClassPath :- No php.MVC application root directory specified; exit; } #$_ENV; // PHP Superglobals !! // Setup the main phpmvc application include() directories here // Note: could be placed in a n xml config file later !! $appDirs = array(); $appDirs[] = ; // application root directory $appDirs[] = lib; // Add the sub-application paths, if any if(is_array($subAppPaths)) { $appDirs = array_merge($appDirs, $subAppPaths); } // Setup the platform specific path delimiter character $delim = NULL; // path delimiter character. (Windows, Unix, Mac!!) $winDir = NULL; if( (int)phpversion() 4 ) { // PHP 5 $winDir = $_ENV["windir"]; // See: PHP v.4.1.0 Superglobals } else { // PHP 4 global $HTTP_ENV_VARS; // depreciated- if( array_key_exists("windir", $HTTP_ENV_VARS) ) { $winDir = $HTTP_ENV_VARS["windir"]; // will be replaced with $_ENV } } if($osType != ) { if( eregi("WINDOWS", $osType) ) { $delim = ;; // Windows } elseif( eregi("UNIX", $osType) ) { $delim = :; // Unix } elseif( eregi("MAC", $osType) ) { $delim = :; // Mac !!!!! } } if($delim == NULL) { if( eregi("WIN", $winDir) ) { // _ENV["C:\\Win2K"] $delim = ;; // Windows } else { $delim = :; // Unix, Mac !! } } // Get the current working directory $path = $appServerRootDir; // Strip path directories below WEB-INF $pathToWebInf = ereg_replace("WEB-INF.*$", , $path); // Replace path backslashes with forward slashes // Note: PHP Regular Expressions do not work with backslashes $pathToWebInf = str_replace("\\", "/", $pathToWebInf); // Drop the trailing slash, if one is present $pathToWebInf = ereg_replace("/$", , $pathToWebInf); // Setup the environment path string $classPath = NULL; foreach($appDirs as $appDir) { $classPath .= $pathToWebInf./.$appDir.$delim; } // Remove trailing delimiter character $classPath = substr($classPath, 0, -1); // Setup the include_path for the duration of the main php.MVC script ini_set(include_path, $classPath); return $classPath; // for testing } // ----- Public Methods ------------------------------------------------- // function getClassPath($appServerRootDir=, $appDirs, $osType=) { // Set AppServer root manually for now if($appServerRootDir == ) { echo Error: ClassPath :- No php.MVC application root directory specified; exit; } #$_ENV; // PHP Superglobals !! // Setup the platform specific path delimiter character $delim = NULL; // path delimiter character. (Windows, Unix, Mac!!) if($osType == ) { // PHPs build in constant "PATH_SEPARATOR" [unix (:) / win (;)] $delim = PATH_SEPARATOR; } else { // It is handy to be able to specift the OS type for testing $delim = ClassPath::getPathDelimiter($osType); } // Get the current working directory $path = $appServerRootDir; // Strip path directories below WEB-INF $pathToWebInf = ereg_replace("WEB-INF.*$", , $path); // Replace path backslashes with forward slashes // Note: PHP Regular Expressions do not work with backslashes $pathToWebInf = str_replace("\\", "/", $pathToWebInf); // Drop the trailing slash, if one is present $pathToWebInf = ereg_replace("/$", , $pathToWebInf); // Setup the environment path string $classPath = NULL; $AbsolutePath = False; // Say: "/Some/Unix/Path/" or "D:\Some\Win\Path" foreach($appDirs as $appDir) { // Check if the specified system path is an absolute path. Absolute system // paths start with a "/" on Unix, and "Ch\:" or "Ch/:" on Win 32. // Eg: "/Some/Unix/Path/" or "D:\Some\Win\Path" or "D:/Some/Win/Path". $AbsolutePath = ClassPath::absolutePath($appDir); if($AbsolutePath == True) { $classPath .= $appDir.$delim; } else { $classPath .= $pathToWebInf./.$appDir.$delim; } } // Remove trailing delimiter character $classPath = substr($classPath, 0, -1); return $classPath; // for testing } /** * Concatenate environment path strings * p * Returns the two path strings joined with the correct environment * string delimiter for the host operating system. * * @param string The path string * @param string The path string * @param string The operating type [optional] * @public * @returns string */ function concatPaths($path1, $path2, $osType=) { // Setup the platform specific path delimiter character $delim = NULL; // path delimiter character. (Windows, Unix, Mac!!) $delim = ClassPath::getPathDelimiter($osType); $path = $path1 . $delim . $path2; return $path; } // ----- Protected Methods ---------------------------------------------- // /** * Get environment path delimiter. * p * Returns the environment string delimiter for the host operating system. * * @param string The operating type [optional] * @protected * @returns string */ function getPathDelimiter($osType=) { // Setup the platform specific path delimiter character $delim = NULL; // path delimiter character. (Windows, Unix, Mac!!) $winDir = NULL; if( (int)phpversion() 4 ) { // PHP 5 $winDir = $_ENV["windir"]; // See: PHP v.4.1.0 Superglobals } else { // PHP 4 global $HTTP_ENV_VARS; // depreciated- if( array_key_exists("windir", $HTTP_ENV_VARS) ) { $winDir = $HTTP_ENV_VARS["windir"]; // will be replaced with $_ENV } } if($osType != ) { if( eregi("WINDOWS", $osType) ) { $delim = ;; // Windows } elseif( eregi("UNIX", $osType) ) { $delim = :; // Unix } elseif( eregi("MAC", $osType) ) { $delim = :; // Mac !!!!! } } if($delim == NULL) { if( eregi("WIN", $winDir) ) { // _ENV["C:\\Win2K"] $delim = ;; // Windows } else { $delim = :; // Unix, Mac !! } } return $delim; } /** * Check if the specified system path is an absolute path. Absolute system * paths start with a "/" on Unix, and "Ch\:" or "Ch/:" on Win 32. * Eg: "/Some/Unix/Path/" or "D:\Some\Win\Path" or "D:/Some/Win/Path". * * Returns True if the suppplied path absolute, otherwise returns False * * @param string The path to check, like: "/Some/Unix/Path/" or * "D:\Some\Win\Path". * @public * @returns boolean */ function absolutePath($systemPath) { // Say: "/Some/Unix/Path/" or "D:\Some\Win\Path" or "D:/Some/Win/Path" $fAbsolutePath = False; // Boolean flag value //"[/]Some/Unix/Path/" if (preg_match("/^\//", $systemPath)) { $fAbsolutePath = True; //"[D:\]Some\Win\Path" // "i" says "ignore case" // Note the extra escape "\" reqd for this to work with PHP !!! } elseif(preg_match("/^[a-z]:\\\/i", $systemPath)) { $fAbsolutePath = True; //"[D:/]Some/Win/Path" } elseif(preg_match("/^[a-z]:\//i", $systemPath)) { $fAbsolutePath = True; } return $fAbsolutePath; }
* ==================================================================== * The module paths * @author John C Wildenauer * @version * @public class ModulePaths { /** * Return an array of global paths * * @public * @returns array */ function getModulePaths() { // Setup the main module include() directories here // Note: could be placed in an xml config file later !! $appDirs = array(); $appDirs[] = ; // starting with the sub-application home directory $appDirs[] = login; $appDirs[] = login/classes; $appDirs[] = login/tpl; $appDirs[] = project; $appDirs[] = project/classes; $appDirs[] = project/tpl; return $appDirs; }
// Set the application path $moduleRootDir = D:/workspace/eh_plat_wms/dev_src; // no trailing slash // Set the OS Type [Optional] [UNIX|WINDOWS|MAC] if we have // trouble detecting the server OS type. Eg: path errors. $osType = WINDOWS; // Setup application class paths first include lib/ClassPath.php; // Setup the module paths include config/ModulePaths.php; $modulePaths = ModulePaths::getModulePaths(); $mPath = ClassPath::getClassPath($moduleRootDir,$modulePaths, $osType); // Retrieve and merge the php.ini path settings $iniPath = ini_get(include_path); $cPath = ClassPath::concatPaths($mPath, $iniPath, $osType); echo $cPath; // And set the include_path variables, as used by the file functions ini_set(include_path, $cPath);
框架外的PHP读取.env文件(php5.6、7.3可用版) 背景:由于项目需要,在框架外(public文件夹下)新建了一个原生的php文件,由于不知道怎么解决。只需要在宝塔上的php相应的版本上把禁用函数去除即可。其他的参数自己根据代码获取,代码简单,自己读吧。“框架外的php文件,怎么使用DB操作”(我的环境 nginx php7,3)于是上网搜索了一早上也没能又方法。于是我使用了,原生连接方法。index.php文件。这里如果出现这样的问题。............
PHP+Laravel框架RabbitMQ简单使用(路由模式) 一、简介 路由模式跟发布订阅模式类似,然后在订阅模式的基础上加上了类型,订阅模式是分发到所有绑定到交换机的队列,路由模式只分发到绑定在交换机上面指定路由键的队列
PHP+Laravel框架RabbitMQ简单使用(Pub/Sub模式) 一、简介 publish-and- subscribe, 即发布订阅模型。在Pub/Sub模型中,生产者将消息发布到一个主题(Topic)中,订阅了该Topic的所有下游消费者,都可以接收到这条消息。 每个消息可以有多个订阅者; 客户端只有订阅后才能接收到消息; 持久订阅和非持久订阅。 发布者和订阅者有时间依赖:接受者和发布者只有建立订阅关系才能收到消息; 持久订阅:订阅关系建立后,消息就不会消失,不管订阅者是否都在线; 非持久订阅:订阅者为了接受消息,必须一直在线。 当只有一个订阅者时约等于点对点模式
PHP+Laravel框架RabbitMQ简单使用(工作队列模式(竞争消费者模式)) 工作模式:一个消息生产者,一个交换器,一个消息队列,多个消费者。同样也称为点对点模式 假如我们拥有两个消费者,默认情况下,RabbitMQ 将按顺序将每条消息发送给下一个消费者,平均而言,每个消费者将获得相同数量的消息,这种分发消息的方式称为轮询。 假如有一些非常耗时的任务,某个消费者在缓慢地进行处理,而另一个消费者则空闲,显然是非常消耗资源的。
相关文章
- 某PHP发卡系统SQL注入
- php文件上传
- PHP获取当前域名$_SERVER['HTTP_HOST']和$_SERVER['SERVER_NAME']的区别
- 配置php.ini实现PHP文件上传功能
- 注意!PHP memcached扩展默认配置下无法自动failover
- PHP cURL模块
- php使用服务器进行远程抓取百度网页内容
- PHP Socket编程 之 php cc攻击代码与防范方法
- Linux 上安装 PHP 扩展
- PHP+Redis实现延迟任务,实现自动取消与完成订单
- PHP实现微信提现功能
- PHP 性能优化 - php.ini 配置
- php自动加载
- PHP采集库-Snoopy.class.php
- file not found. nginx php nginx 如何开启解析 PHP 的功能
- PHP-5.4.4 安装 APC 启东php-fpm 提示
- PHP发送邮件函数sendmail()
- [php-src] 窥探Php内核中的数组与面向对象
- Atitit.png 图片不能显示 php环境下
- Atitit.收银机小票打印功能的设计 java php c#.net版本
- JS调用PHP和PHP调用JS的方法
- PHP面试题:你所知道的php数组相关的函数?
- 【整理】Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)
- PHP Socket 编程过程详解