免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zvxcv
打印 上一主题 下一主题

让PHP来搞定一切! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-12-27 15:35 |只看该作者
学习

论坛徽章:
0
12 [报告]
发表于 2006-12-27 17:20 |只看该作者
我就等着用lz的成果拉。。。先泡妞去。。。

论坛徽章:
0
13 [报告]
发表于 2006-12-27 17:22 |只看该作者

这一方案的可行性初步测试成功,令人鼓舞!

这一方案的可行性初步测试成功,令人鼓舞

首先需要编绎一个纯静态的PHP CGI程序,但编绎过程并不是一帆风顺的。首先php configure脚本里面并没有生成纯静态PHP的参数,因此在configure过程之后,需要删除配置文件:main/php_config.php中HAVE_DLOPEN和HAVE_LIBDL这两个宏定义,以免引用不必要动态链接库。然后用make进行编绎,编绎成功后,所输出的可执行文件sapi/cgi/php仍然是一个动态链接程序。为了得到纯静态编绎的php文件,可以将make反馈信息最后包含libtool的这一行提取出来,写入一个文件,作为一个脚本。
/usr/local/src/php-4.4.4/libtool --silent --preserve-dup-deps --mode=link gcc -export-dynamic -g -O2 ...
将其中--silent参数换成-n,执行此脚本,这时将输出所要执行的连接命令,但并不执行,它的形式为:
gcc -g -O2 ...
将这一输出的命令写入一个新文件,将其中的-g改为-static,并删除“-ldl”这些对动态链接库的引用。
然后执行这个新脚本,就可以生成出纯静态的php可执行文件,如果strip其调试信息,其大小只有1817676字节。

接下来,将通过无盘启动的方式来测试将这一纯静态PHP作为init进程的可行性。

首先建立一个8M的空白文件php.img,在其上创建一个ext2文件系统,以loop方式挂载到某一目录下。在其上建立/dev、/etc、/sbin、/proc、usr/local/bin、/usr/local/lib这几个目录,在/dev中创建好console、ram、zero、null、mem这些少许几个必要设备,将编绎好的php拷入其usr/local/bin下,将其sbin/init符号链接或硬链接到usr/local/bin/php,然后创建usr/local/lib/php.ini文件,其内容可以简单的设为
[PHP]
auto_prepend_file = /etc/initrc.php
在etc/initrc.php中创建一些测试代码,来显示其执行过程。卸载安装目录,用gzip压缩其映象,然后传到TFTP服务器上。无盘启动采用dhcpd+tftp+pxelinux.0的软件组合,配置好无盘机有关的dhpcd.conf参数,在pxelinux.cfg/default中增加启动配置,
LABEL php
      KERNEL el-vmlinuz-2.4.21-32.EL #这是RHEL 3的缺省内核
      APPEND initrd=php.img.gz root=/dev/ram

最后在测试机器上进行网络启动, 启动完成后,就可以看到屏幕上显示/etc/initrc.php脚本所输出的内容,然后系统就进入PHP的标准输入状态,如果按CTRL+C强制PHP退出,系统就会产生INIT进程致命退出错误。

我测试的Linux是RHEL 3,所使用PHP的configure参数为:

configure --enable-fastcgi --with-zlib --enable-sockets --with-mime-magic --enable-pcntl --enable-sysvmsg --enable-sysvsem --enable-sysvshm --disable-cli --disable-shared

编绎一个纯静态的PHP是成功的关键,作为第一次尝试,我没有尝试加入更多的PHP模块,但是如果加入其它更多的模块,肯定会遇到更多棘手的问题需要克服。

论坛徽章:
0
14 [报告]
发表于 2006-12-27 17:28 |只看该作者
原帖由 achun.shx 于 2006-12-27 13:31 发表
哈哈,好想法,不过首先要解决用户登录和远程管理的问题呀!


这一方案的绝妙之处就在于“用户登录和远程管理”全部可以用寻常网站的PHP编制方法与浏览器的交互来完成,不需要使用专门的协议或特别的处理。

论坛徽章:
0
15 [报告]
发表于 2006-12-27 19:54 |只看该作者
这和操作系统又有什么区别...

论坛徽章:
0
16 [报告]
发表于 2006-12-28 01:50 |只看该作者
这种情况适合专用系统,小型系统
特别好管理,但当你的系统足够大,如你的网站有几千万HTTP的访问量,有数百万个文件,有十亿行数据库,使用mysql就不适合了
运行效率还有待观察

论坛徽章:
0
17 [报告]
发表于 2006-12-28 08:59 |只看该作者
等待中.................

论坛徽章:
0
18 [报告]
发表于 2006-12-28 09:09 |只看该作者
php如果正在运行如何升级呢?
远程登录的方法没看懂,是用php写shell吗?

貌似用作嵌入式环境是可行的.

论坛徽章:
0
19 [报告]
发表于 2006-12-28 09:27 |只看该作者

最新进展

我现在用NFSROOT方式,而不再采用RAMDISK ROOT方式来运行测试系统,不过需要重新配置和编绎Linux内核,配置好网卡驱动和启用内核IP配置和NFSROOT几个参数。还成功编绎了纯静态的MySQL,仍然需要编绎纯静态PHP所使用的技巧,实际只需要sql/mysqld这个可执行文件。

/etc/initrc.php可以采用如下的框架

if (posix_getpid() == 1) {
        ... # 直接通过操作系统调用接口而不是外部命令来直接配置Linux内核参数
        if (pcntl_fork() == 0) { # 启动PHP FASTCGI服务器
                posix_setuid(501);
                $env['PHP_FCGI_CHILDREN'] = 10;
                $env['PHP_FCGI_MAX_REQUESTS'] = 1000;
                echo "starting fastcgi server.\r\n";
                pcntl_exec('/usr/local/bin/php',array('-b',':8000'), $env);
                echo "start fastcgi server FAILED!\r\n";
        }
        if (pcntl_fork() == 0) {
                echo "starting mysql server.\r\n";
                posix_setuid(502);
                pcntl_exec('/usr/local/bin/mysqld',array('--skip-innodb','--skip-name-resolve'));
                echo "start mysql server FAILED!\r\n";
        }
        sleep(1);
        if ($mydb = mysql_connect('localhost','user','password')) {
                echo "mysql server started.\r\n";
        }
        echo "READY.\r\n";

        # 最关键的就是在以下部分使用php sockets接口以单进程多工技术来写一个HTTP服务器,来与fastcgi服务器通信,当然也必须能完成简单静态文件服务。
        ...
}
/etc/initrc.php不仅是系统初始化的脚本,也是每一个FASTCGI请求脚本的初始化脚本,因此我们可以把常用的过程定义在此文件中,对每一个脚本共享。
将mmcache静态编绎到PHP中可以提高initrc.php的加载执行效率,而且是必须采用的手段。

进一步的设想是将PHP和MySQL编绎在一起,做成单一可执行文件,这样PHP和MySQL可以共享原动态链接库的大量代码,进一步降低系统总的文件尺寸,用一个内核,一个程序来搞定一切!更绝的是,可以让PHP能够通过MySQL中更低级的函数接口来直接访问MySQL数据库,而不必总是通过SQL语言来访问MySQL数据库,这样可以获得更好的性能。而对于MySQL来说,设法让MySQL表达式能够使用PHP里面的某些函数,形成一种互惠互利的关系。

对PHP来说,还有一个地方值得注意的是Windows的PHP ISAPI模块使用了PHP的多线程运行模式,而在Linux下,我们能否让PHP FASTCGI服务器以多线程模式来运行?

我觉得对于传统的UNIX架构,适合于开发,而对于某种具体应用来说,就显得太复杂、太庞大了。一个操作系统是某种编程语言的世界,UNIX操作系统是C语言的世界,C语言是所有高级语言的基础,UNIX是所有高级操作系统之母。让我们有纯粹PHP的世界,纯粹Java世界,纯粹PERL世界,纯粹Python、纯粹Ruby世界,用一个内核+一个解释器彻底搞定一切。

[ 本帖最后由 zvxcv 于 2006-12-28 09:50 编辑 ]

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
20 [报告]
发表于 2006-12-28 09:50 |只看该作者
原帖由 zvxcv 于 2006-12-28 09:27 发表
我现在用NFSROOT方式,而不再采用RAMDISK ROOT方式来运行测试系统,不过需要重新配置和编绎Linux内核,配置好网卡驱动和启用内核IP配置和NFSROOT几个参数。还成功编绎了纯静态的MySQL,仍然需要编绎纯静态PHP所使 ...


  真的是很好地想法,但是还是要套用前面的话:
原帖由 夜猫子 于 2006-12-27 13:22 发表
楼主看来像是极端的脚本技术原教旨主义分子


  目前的系统是由专有化趋于灵活多样化,你现在要再次退回专有化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP