

访问动态资源的时候,apache就是个异构代理服务器,接收并转发用户的请求。通过CGI或者fastcgi接口将请求转发给php解释器。
apache请求转发的时候可能会涉及到跨网络转发,跨网络转发使用fastcgi来实现。
异构代理:接受请求和转发请求使用的通信协议不同
同构代理:接收请求和转发请求使用的通信协议相同
CGI:
Common Gateway Interface 公共网关接口,apache接收到请求以后,就会生成一个子进程来运行外部的php或者其他程序的运行工具,这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户。
特点:
执行完成后会销毁这个子进程,如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程,周而复始的进行。早期时候使用较多,同时有多少个请求就生成多少个子进程。
例如:范例:httpd 利用CGI运行shell脚本
#apache默认就带cgi的功能
[root@CentOS8 cgi-bin]# httpd -M | grep cgi
proxy_fcgi_module (shared)
proxy_scgi_module (shared)
cgid_module (shared)
#默认需要将脚本文件放到apache的/var/www/cgi-bin/目录下
[root@CentOS8 ~]# cat /etc/httpd/conf/httpd.conf | grep cgi
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
# "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
<Directory "/var/www/cgi-bin">
#AddHandler cgi-script .cgi
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
[root@CentOS8 cgi-bin]# pwd
/var/www/cgi-bin
[root@CentOS8 cgi-bin]# cat test.sh
#!/bin/bash
#
cat << EOF
Content-Type: text/html
<pre>
My username is: $(id -un)
My id is: $(id -u)
My shell settings are:
$(set)
My environment variables are:
$(env)
Here is the file in /etc:
$(ls -l /etc/redhat-release )
$( cat /etc/redhat-release )
</pre>
EOF
[root@CentOS8 cgi-bin]# curl http://10.0.0.14/cgi-bin/test.sh
apache2会识别CGI代码的前两行,以确定使用什么解释器进行解释执行,所以前两行的申明很重要。
web服务器收到一个请求时,不会重新生成一个子进程(因为这个子进程在web服务器启动时就开启了,而且不会退出),web服务器直接把内容传递给这个进程(进程间通信,但fastcgi使用了别的方式,tcp方式通信),这个进程收到请求后进行处理,把结果返回给web服务器,最后自己接着等待下一个请求的到来,而不是退出
CGI: 兼职, 一次性的过河拆桥式的服务
FASTCGI: 专职,全周期的持续式的服务
PHP:是一种脚本型的解释型语言
Opcode是一种PHP脚本编译后的中间语言
1.把php的文本文件转化为opcode语言
2.将opcode解释为计算机可执行的二进制
代码文件 ---(Zend引擎)--->opcode码---()--->
配置文件的来源:
[root@CentOS8 ~]# rpm -qf /etc/php.ini
php-common-7.2.24-1.module_el8.2.0+313+b04d0a66.x86_64
类似于mysql,注释使用的是(;)进行注释
使用([])分为多个语句块
[foo]:Section Header
directive = value
php.ini的核心配置选项文档: http://php.net/manual/zh/ini.core.php
php.ini配置选项列表:http://php.net/manual/zh/ini.list.php
expose_php = On #响应报文显示首部字段x-powered-by: PHP/x.y.z,暴露php版本,建议为off
max_execution_time= 30 #最长执行时间30s
memory_limit=128M #生产不够,可调大
display_errors=off #调试使用,不要打开,否则可能暴露重要信息
display_startup_errors=off #建议关闭
post_max_size=8M #最大上传数据大小,生产可能调大,比下面项大
upload_max_filesize =2M #最大上传文件,生产可能要调大
max_file_uploads = 20 #同时上传最多文件数
date.timezone =Asia/Shanghai #指定时区 默认使用的是utc时间
short_open_tag=on #开启短标签,如: <? phpinfo();?>
修改完php配置文件后,需要重启php的相关软件才能生效。
#CentOS 8 上面不是依附于apache的一个模块,而是一个独立的服务
#CentOS 7中,php是作为一个依附于apache的一个模块,不是一个独立的服务
[root@CentOS8 ~]# ps aux | grep php
root 60277 0.0 0.9 166852 18020 ? Ss 19:02 0:00 php-fpm: master process (/etc/php-fpm.conf)
apache 60278 0.0 0.5 183184 10172 ? S 19:02 0:00 php-fpm: pool www
apache 60279 0.0 0.5 183184 10172 ? S 19:02 0:00 php-fpm: pool www
apache 60280 0.0 0.5 183184 10172 ? S 19:02 0:00 php-fpm: pool www
apache 60281 0.0 0.5 183184 10176 ? S 19:02 0:00 php-fpm: pool www
apache 60282 0.0 0.5 183184 10176 ? S 19:02 0:00 php-fpm: pool www
root 61303 0.0 0.0 12112 1044 pts/0 S+ 19:46 0:00 grep --color=auto php
[root@CentOS8 ~]# systemctl restart php-fpm.service
httpd 接收用户的web请求;静态资源则直接响应;动态资源为php脚本,对此类资源的请求将交由php
来运行
模块文件:将php编译成为httpd的模块libphp5.so,只有prefork 模式才支持(CentOS 7 默认是这个)
FastCGI:php和apache是两个单独的服务(CentOS 8 默认使用factcgi模式)
动态资源的请求方式:
Client -- http --> httpd --> libphp5.so () -- mysql --> MySQL server
Client -- http --> httpd -->fastcgi-- mysql --> MySQL server
前提:
需要安装MySQL、apache、php这三个软件包
1. 使用mysqli扩展连接数据库:
使用mysqli扩展模块mysqli.so连接数据,此方式只能连接MySQL数据库,不支持其它数据库
<?php
$mysqli=new mysqli("mysqlserver", "username", "password");
if(mysqli_connect_errno()){
echo "Failure";
$mysqli=null;
exit; }
echo "OK";
$mysqli->close();
?>
默认安装php的时候是没有安装连接mysql的工具包的
#CentOS 8 需要安装php-mysqlnd这个软件包才会生成对应的模块
[root@CentOS8 ~]# rpm -ql php-mysqlnd
/etc/php.d/20-mysqlnd.ini
/etc/php.d/30-mysqli.ini
/etc/php.d/30-pdo_mysql.ini
/usr/lib/.build-id
/usr/lib/.build-id/27
/usr/lib/.build-id/27/050298f7ae4de2117b0325d5e1f354539efa77
/usr/lib/.build-id/43
/usr/lib/.build-id/43/0aa1d5fd22f68c8c868a0ffb6473f529360ca8
/usr/lib/.build-id/c9
/usr/lib/.build-id/c9/713dbdb20adf4b190b48176317b0c06d691f4e
/usr/lib64/php/modules/mysqli.so
/usr/lib64/php/modules/mysqlnd.so
/usr/lib64/php/modules/pdo_mysql.so
#不加斜线认为是软连接,加了斜线认为是文件夹
[root@CentOS8 ~]# find /lib64/ -name mysqli.so
/lib64/php/modules/mysqli.so
2. 使用PDO(PHP Data Object)扩展连接数据库:
使用PDO扩展模块pdo_mysql.so连接数据库,此方式可以支持连接MySQL,Oracle等多种数据库
范例:php使用pdo扩展连接数据库的测试代码1
<?php
$dsn='mysql:host=mysqlhost;port=3306;dbname=mysql';
$username='root';
$passwd='magedu';
$dbh=new PDO($dsn,$username,$passwd);
var_dump($dbh);
?>
例如:
[root@CentOS8 html]# cat lamp.php
<?php
$servername = "localhost";
$username = "root";
$password = "";
try {
$conn = new PDO("mysql:host=$servername;dbname=mysql", $username, $password);
// 将PDO错误模式设置为异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "连接成功";
}
catch(PDOException $e){
echo "连接失败:".$e->getMessage();
}
?>
PhpMyAdmin是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库,官网:https://www.phpmyadmin.net/
1.下载软件包
官网:https://www.phpmyadmin.net/
注意:
#不下载这两个对应的包 pma不会给浏览器返回任何信息
[root@CentOS8 html]# yum install php-xml php-json
2.解压到apache的根目录下
3.测试:
http://10.0.0.14/pma/
WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上
架设属于自己的网站。也可把 WordPress当作一个内容管理系统(CMS)来使用,
官网:https://cn.wordpress.org/
2.解压到网站的根目录
3.测试
上传的文件存放位置:/var/www/html/blog/wp-content/
Crossday Discuz! Board(简称 Discuz!)是一套通用的社区论坛软件系统。自2001年6月面世以来,是覆盖率最大的论坛软件系统之一。2010年8月23日与腾讯达成收购协议,官网:https://www.discuz.net/
1.去官网下载对应的安装包
2.解压安装包(只需要里面的uploade目录)
3.移动到apache服务的根目录
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在