免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 16107 | 回复: 8
打印 上一主题 下一主题

socket_create怎成了undefined function? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-14 15:50 |只看该作者 |倒序浏览
这是PHP Manual中socket段的样例,怎么会出错呢?
在console中输入
$ /usr/local/bin/php -f socket_test.php
运行出现以下错误提示:

PHP Fatal error: Call to undefined function socket_create() in /webroot/test/socket_test.php on line 15

Line 15:
if (($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {



  1. #!/usr/local/bin/php
  2. #file name: socket_test.php
  3. <?php
  4. error_reporting(E_ALL);
  5. /* Allow the script to hang around waiting for connections. */
  6. set_time_limit(0);

  7. /* Turn on implicit output flushing so we see what we're getting
  8. * as it comes in. */
  9. ob_implicit_flush();

  10. $address = 'localhost';
  11. $port = 56753;

  12. if (($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {
  13.     echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n";
  14. }

  15. if (($ret = socket_bind($sock, $address, $port)) < 0) {
  16.     echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n";
  17. }

  18. if (($ret = socket_listen($sock, 5)) < 0) {
  19.     echo "socket_listen() failed: reason: " . socket_strerror($ret) . "\n";
  20. }

  21. do {
  22.     if (($msgsock = socket_accept($sock)) < 0) {
  23.         echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
  24.         break;
  25.     }
  26.     /* Send instructions. */
  27.     $msg = "\nWelcome to the PHP Test Server. \n" .
  28.         "To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
  29.     socket_write($msgsock, $msg, strlen($msg));

  30.     do {
  31.         if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
  32.             echo "socket_read() failed: reason: " . socket_strerror($ret) . "\n";
  33.             break 2;
  34.         }
  35.         if (!$buf = trim($buf)) {
  36.             continue;
  37.         }
  38.         if ($buf == 'quit') {
  39.             break;
  40.         }
  41.         if ($buf == 'shutdown') {
  42.             socket_close($msgsock);
  43.             break 2;
  44.         }
  45.         $talkback = "PHP: You said '$buf'.\n";
  46.         socket_write($msgsock, $talkback, strlen($talkback));
  47.         echo "$buf\n";
  48.     } while (true);
  49.     socket_close($msgsock);
  50. } while (true);

  51. socket_close($sock);
  52. ?>

复制代码

[ 本帖最后由 alinker 于 2006-4-14 15:52 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-04-14 15:58 |只看该作者
我再查了下手册,

应该是AF_INET,SOCK_STREAM,SOL_TCP这三个预定义常量无值,需要由扩展模块定义,只有在扩展模块被编译到 PHP 中,或者在运行时被动态加载后才有效。

那在PHP全装好后,如何再加载扩展模块?

论坛徽章:
0
3 [报告]
发表于 2006-04-14 16:39 |只看该作者
dl() 可以动态装载
前提是目的模块已经编译好并且放在恰当的路径下
php被配置为允许dl()运行

论坛徽章:
0
4 [报告]
发表于 2006-04-14 16:45 |只看该作者
原帖由 donyad 于 2006-4-14 16:39 发表
dl() 可以动态装载
前提是目的模块已经编译好并且放在恰当的路径下
php被配置为允许dl()运行


请说详细点...谢谢回贴~

论坛徽章:
0
5 [报告]
发表于 2006-04-14 17:09 |只看该作者
请多使用手册和搜索引擎,谢谢

http://cn.php.net/manual/zh/function.dl.php

论坛徽章:
0
6 [报告]
发表于 2006-04-14 23:16 |只看该作者
原帖由 donyad 于 2006-4-14 17:09 发表
请多使用手册和搜索引擎,谢谢

http://cn.php.net/manual/zh/function.dl.php



万分感谢,谢谢您的指教!

论坛徽章:
0
7 [报告]
发表于 2006-04-17 11:01 |只看该作者
原帖由 donyad 于 2006-4-14 16:39 发表
dl() 可以动态装载
前提是目的模块已经编译好并且放在恰当的路径下
php被配置为允许dl()运行


现在目标模块找不着,sockets.so是如何生成的?
在php安装后,如何再编译模块?
不好意思, 在manual里没找着编译模块的内容...

论坛徽章:
0
8 [报告]
发表于 2006-04-17 11:13 |只看该作者
原帖由 alinker 于 2006-4-17 11:01 发表


现在目标模块找不着,sockets.so是如何生成的?
在php安装后,如何再编译模块?
不好意思, 在manual里没找着编译模块的内容...


呵~发完贴我就找到几篇http://man.chinaunix.net/newsoft/ModSecurity_for_Apache/chpt2.htm
http://dev-club.esnai.com/club/bbs/showEssence.asp?id=27492
http://my.opera.com/wangzhijun/blog/show.dml/121550
http://www.linuxmine.com/1689.html
http://www.emagister.cn/cursos-php%E6%8A%80%E6%9C%AF-php%E5%92%8Csocket-simcour-2200485.htm
http://www.tufat.com/docs/flashchat/socket_server_linux.html




有需要的朋友可以一起学学...

[ 本帖最后由 alinker 于 2006-4-20 14:17 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2006-04-17 23:20 |只看该作者

自己动手用 C 扩展 PHP

[ZT]自己动手用 C 扩展 PHP

引言:
   有感于大多数人认为 PHP 只是一种弱类型,只能做小型web应用的脚本语言。 与目前的Java, .Net平台有一定的差距,所以决定写一些 PHP 的扩展方法文章,我相信
我们PHPER们通过自己动手写商业扩展,一定能构建出强大的,极速的Web应用,因为扩展本身就是编译型语言编写的(c/c++),而且可以
预先驻留内存的(Apache启动时加载),有了 C/C++ 编写的扩展,我们几乎可以无所不能.
   呵呵,Zend 的说明文档少之又少,真令人头疼
----------------------------------------------------------

环境要求:  Linux, GCC


首先,我们应该选择如何去构建我们的扩展模块, 有三种方式:
         1. External Modules
        外部模块,也就是编译成共享库,用dl()函数动态加载。
        好处:    (1)不需要重新编译 PHP (2)PHP体积小,因为不需要编译进PHP
        缺点:     (1)每次*.php脚本执行都需要用 dl()去加载,效率较低
               (2)每次都要调用dl()
    2. Built-in Modules
        编译进PHP
        好处:    (1)不需要动态加载,模块在php脚本里面可以直接使用.
            (2)不需要将模块编译成.so共享库,因为直接编译进PHP。
        缺点:    (1)对模块的改变都需要重新编译PHP
            (2)因为编译进PHP,所以PHP二进制文件较大,而且多占点内存
    3. The Zend Engine
        Zend 核心里实现        (略 ... 有兴趣的话可以看 Zend API)

Note: 本人推荐用 第 2 种方式,直接编译进PHP, 但是在下面示例里,我们编译成外部模块
    ,因为,外部模块不需要重新编译 PHP,所以在测试阶段先编译成共享库,然后用dl()
    加载(不过记得在php.ini里将安全模式设为 Off),测试完后再用第2种方式重新编译进    PHP.

1. 首先下载 PHP 源代码, 解压。 然后我们开始构建代码结构,可以利用 PHP 源代码包ext目录里提供的 ext_skel 程序去生成我们需要的结构.

    [ext]#./ext_skel --extname=haosoft_php_module

这样会在ext下生成一个 haosoft_php_module 目录。
目录里有 config.m4, haosoft_php_module.h, haosoft_php_module.c 等几个文件。

2. haosoft_php_module.h 为模块的头文件(熟悉C语言的应该了解),  用 VI 打开,删除其中的一行:
    PHP_FUNCTION(confirm_MyExt_compiled);    /* For testing, remove later. */
改为:
    PHP_FUNCTION(haosoft_test);    /* For testing, remove later. */
说明:
    PHP_FUNCTION() 是一个 Zend Macro,作用是声名一个 C 函数,使他在 PHP 脚本里可用, 参数    是函数的名字,我们这里的示例函数为 haosoft_test.

3. haosoft_php_module.c 为主文件,里面包含了实现, VI 打开,我们删除掉
PHP_FUNCTION(confirm_MyExt_compiled)
{
    char *arg = NULL;
    int arg_len, len;
    char string[256];

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
        return;
    }
    len = sprintf(string, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "haosoft_php_module", arg);
    RETURN_STRINGL(string, len, 1);
}
增加:
PHP_FUNCTION(haosoft_test) {
    zend_printf("This is my php module !";
}

4. 现在,我们开始编译我们的模块,因为要编译成 so,我们选择手工编译。
进入 ext 目录:

开始编译,编译成*.o对象文件,注意这个"-DCOMPILE_DL_HAOSOFT_PHP_MODULE",

在 haosoft_php_module.c 里你可以找到下面的语句

#ifdef COMPILE_DL_HAOSOFT_PHP_MODULE
ZEND_GET_MODULE(haosoft_php_module)
#endif

HAOSOFT_PHP_MODULE 是大写模块名,你可以换成其他名,但是必须保证这个预处理常量与
上面的语句里一致,至于上面语句的 ZEND_GET_MODULE(haosoft_php_module) 我们将在下一篇文
章讲解它的意思.

[ext]# cc -fpic -DCOMPILE_DL_HAOSOFT_PHP_MODULE=1 -I/usr/local/include -I. -I../main -I.. -I../TSRM -I../Zend -c -o haosoft_php_module/haosoft_php_module.o haosoft_php_module/haosoft_php_module.c

执行完之后会在 目录下生成一个haosoft_php_module.o文件,接下来 连接:
[ext]#  cc -shared -L/usr/local/lib -rdynamic -o haosoft_php_module/haosoft_php_module.so haosoft_php_module/haosoft_php_module.o

这样会在目录下生成了我们需要的 haosoft_php_module.so 文件。
然后我们要建立一个目录
[ext]# mkdir -p /usr/local/php/lib/php/extensions/no-debug-non-zts-20041030
上面的 20041030 的号码是Zend内部模块API号码,如果你不知道的话,你先建立一个php文
件:
test.php

<?
dl("abc.so";
?>

在浏览器里运行该文件会出现错误信息, 可以在错误信息里得到这个号码,请根据自己情况根据这个号码与你的PHP安装目录更改路径。

建立完目录后接下来,我们把haosoft_php_module.so移动到刚刚的目录里去
[ext]# mv haosoft_php_module/haosoft_php_module.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20041030

OK! 我们可以测试刚建立的模块了,目前模块里只有一个 haosoft_test() 的无参数方法。

建立 php 文件:

test.php

<?php
// 加载刚建立的模块
dl("haosoft_php_module.so";
// 调用函数
haosoft_test();
?>

执行。 看到显示 "This is my module !" 了吗?

5. 好了,模块编译,并测试无误后,我们可以将他编译进 PHP 了,回到 PHP源代码包根目录
执行:
[php-5.0.6]#./buildconf --force
[php-5.0.6]#./configure --enable-haosoft_php_module ... 也许你还有其他选项
[php-5.0.6]#make
[php-5.0.6]#make install
[php-5.0.6]#sh /etc/init.d/httpd restart   ... 这里是重启 apache

---------------------------------------------------------------
本示例在我 PHP5.0.6 上编译通过,  下一章我们再详细分析 haosoft_php_module.h, haosoft_php_module.c 这两个文件里的内容,以及有参数,有返回值函数的定义及使用.
4 点了,偶该睡觉了! 有时间再写下一章。 希望以上内容对大家会有所帮助!

----------------------------------------------------------------

作者: 黄浩
网名: black_key or ROOT1
mail: kkk139@126.com

转载请保留以上信息,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP