Code前端首页关于Code前端联系我们

phpvirtualhost的简单介绍

terry 2年前 (2023-09-30) 阅读数 27 #PHP
文章标签 addAttribute

本文目录一览:

  • 1、php检测上传文件大小的问题
  • 2、PHP运行于Apache 模块方式
  • 3、php程序怎么部署运行
  • 4、php网站搭建端口问题

php检测上传文件大小的问题

在用PHP进行文件上传的操作中,需要知道怎么控制上传文件大小的设置,而文件可传大小是受到多种因素制约的,现总结如下:

1、php.ini:upload_max_filesize 所上传的文件的最大大小。默认值2M。

2、php.ini:memory_limit 本指令设定了一个脚本所能够申请到的最大内存字节数,默认值8M。如果不需要任何内存上的限制,必须将其设为 -1。如果内存不够,则可能出现错误:Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)

3、php.ini:post_max_size 设定POST数据所允许的最大大小。此设定也影响到文件上传。要上传大文件,该值必须大于 upload_max_filesize。

4、php.ini:max_execution_time = 30 ; Maximum execution time of each script, in seconds

5、php.ini:max_input_time = 60 ; Maximum amount of time each script may spend parsing request data

6、如果用到mysql的BLOB进行二进制文件存储,则需要设置my.ini:max_allowed_packet=xxM

7、httpd.conf

在 Apache 里面有一个选项是 LimitRequestBody,这个选项可以限制用户送出的 HTTP 请求内容。这个选项可以在 .htaccess 或 httpd.conf 里使用,而如果在 httpd.conf 内使用,分别可以用在 virtualhost 或目录属性设定。而 LimitRequestBody 的设定值是介乎 0 (无限制) 至 2147483647 (2GB)。

例如要在目录 D:/AppServ/www 设定上传限制为 100K,可以在 .htaccess 或 httpd.conf 加入以下语句:

LimitRequestBody 1024000000

Options Indexes FollowSymLinks MultiViews ExecCGI

AllowOverride All

Order allow,deny

Allow from all

LimitRequestBody 1024000000Options Indexes FollowSymLinks MultiViews ExecCGIAllowOverride AllOrder allow,denyAllow from all

如果透过 .htaccess 设定,储存档案后会立即生效;如透过 httpd.conf 设定,须要重新启动 Apache。

PHP关于文件上传部分,特别提到表单隐藏域:MAX_FILE_SIZE,意思是接收文件的最大尺寸。文档中给出的例子如下:

form enctype="multipart/form-data" action="_URL_" method="POST"

input type="hidden" name="MAX_FILE_SIZE" value="30000"

Send this file: input name="userfile" type="file"

input type="submit" value="Send File"

form

Send this file:

这里设置MAX_FILE_SIZE = 30000,期待一种可能,使得浏览器在传送文件之前能够依此作出预先判断,如果文件尺寸大于30000字节,则不执行实际的POST动作。也就是不往服务器发送文件内容,而是直接在客户端提醒用户“你试图上传的文件超过30000字节”。

这的确是一个非常棒的主张,但在现实中却暂时无法实现。不是因为这个限制可以“被简单地绕过”,而是IE和FireFox这两个主流浏览器都不支持这个特性。PHP的这个建议尚未被采纳。

MAX_FILE_SIZE还有一个用场:后台PHP会判断接收到的文件大小是否大于这个值,如果超出,$_FILES['thisfile']['error']会被设置为UPLOAD_ERR_FORM_SIZE(2),同时放弃保存临时文件,将$_FILES['thisfile']['size']置0。

这个例子,没问题,表现正常,当我试图上传一个40多K的文件时,PHP程序报告“文件超过MAX_FILE_SIZE”。

但是,如果我们将表单中的MAX_FILE_SIZE从30000减少到1000,情形又如何呢?

上传800字节的文件,正常;

上传40K的文件,PHP报告文件过大,也正常;

上传3000个字节的文件,PHP未报告错误,它成功保存了文件!出乎意料!

问题就出在main/rfc1867.c中判断文件是否超长的这部分代码上。php每次从buffer中读取FILLUNIT字节长度的内容后,首先判断“已经读到的内容长度(total_bytes)”是否大于MAX_FILE_SIZE,然后再增加“已经读到的内容长度(total_bytes)”。这样一来,和预计的结果之间至多会有FILLUNIT字节的误差,而FILLUNIT=1024*5=5K。(点击bug了解详细内容)

这就是说,当MAX_FILE_SIZE5K时,上传一个大于MAX_FILE_SIZE,但是小于5K的文件是没有问题的。

当然,因为这个设置很容易被绕过,所以服务器端编程不应当依赖于MAX_FILE_SIZE。而且,5K到底是个很小的数值,对大多数上传文件的表单来说没有影响。

PHP中post_max_size,upload_max_filesize, MAX_FILE_SIZE的设置,和客户端上传给服务器端的流量大小无关。

Apache服务器从客户端接收长度不超过LimitRequestBody字节数的请求,然后传送给php模块,php模块再决定是否保存成临时文件,设置$_FILES全局变量,移交给script进一步处理。

这个Apache的LimitRequestBody选项缺省值=0,允许Request body的最大字节数是2G(Linux + Apache)

最后还要注意的是:

html本身能够post数据也是有限制的,不能超过2G。

FTP客户端有文件偏移指针的2GB边界限制,未使用特殊编译flag编译的ftp服务器端或者客户端,无论在什么FS中都不支持大于2GB的文件。不知道PHP会不会也有这种情况。

PHP运行于Apache 模块方式

当使用 PHP 作为 Apache 模块时,也可以用 Apache 的配置文件(例如 httpd.conf)和 .htaccess 文件中的指令来修改 PHP 的配置设定。需要有“AllowOverride Options”或“AllowOverride All”权限才可以。

有几个 Apache 指令可以使用户在 Apache 配置文件内部修改 PHP 的配置。哪些指令属于 PHP_INI_ALL,PHP_INI_PERDIR 或 PHP_INI_SYSTEM 中的哪一个,请参考附录中的 php.ini 配置选项列表。

php_value name value

设定指定的值。只能用于 PHP_INI_ALL 或 PHP_INI_PERDIR 类型的指令。要清除先前设定的值,把 value 设为 none。

Note: 不要用 php_value 设定布尔值。应该用 php_flag(见下面)。

php_flag name on|off

用来设定布尔值的配置指令。仅能用于 PHP_INI_ALL 和 PHP_INI_PERDIR 类型的指令。

php_admin_value name value

设定指定的指令的值。不能用于 .htaccess 文件。任何用 php_admin_value 设定的指令都不能被 .htaccess 或 virtualhost 中的指令覆盖。要清除先前设定的值,把 value 设为 none。

php_admin_flag name on|off

用来设定布尔值的配置指令。不能用于 .htaccess 文件。任何用 php_admin_flag 设定的指令都不能被 .htaccess 或 virtualhost 中的指令覆盖。

Example #1 Apache 配置例子

IfModule mod_php5.c

php_value include_path ".:/usr/local/lib/php"

php_admin_flag engine on

/IfModule

IfModule mod_php4.c

php_value include_path ".:/usr/local/lib/php"

php_admin_flag engine on

/IfModule

Caution

PHP 常量不存在于 PHP 之外。例如在 httpd.conf 中不能使用 PHP 常量如 E_ALL 或 E_NOTICE 来设定 error_reporting 指令,因为其无意义,实际等于 0。应该用相应的掩码值来替代。这些常量可以在 php.ini 中使用。

通过 Windows 注册表修改 PHP 配置

在 Windows 下运行 PHP 时,可以用 Windows 注册表以目录为单位来修改配置。配置值存放于注册表项 HKLM\SOFTWARE\PHP\Per Directory Values 下面,子项对应于路径名。例如对于目录 c:\inetpub\wwwroot 的配置值会存放于 HKLM\SOFTWARE\PHP\Per Directory Values\c\inetpub\wwwroot 项下面。其中的设定对于任何位于此目录及其任何子目录的脚本都有效。项中的值的'名称是 PHP 配置指令的名字,值的数据是字符串格式的指令值。值中的 PHP 常量不被解析。不过只有可修改范围是 PHP_INI_USER 的配置值可以用此方法设定,PHP_INI_PERDIR 的值就不行。

其它接口下的 PHP

无论怎样运行 PHP,都可以在脚本中通过 ini_set() 而在运行时修改某个值。更多信息见手册中 ini_set() 的页面。

如果对自己系统中的配置设定及其当前值的完整列表感兴趣,可以运行 phpinfo() 函数并查看其结果的页面。也可以在运行时用 ini_get() 或 get_cfg_var() 取得个别配置指令的值。

add a note add a note

User Contributed Notes 13 notes

up

down

3 Anteaus ?2 years ago

One of the most serious problems here is that it is hard to determine programmatically which of three or more possible configuration methods (php.ini, .user.ini, .htaccess) should be used on any given hosting company's server.

The worst outcome is if an install.php routine attempts to set .htaccess directives on a cgi-mode server, in which case the outcome is usually a '500' crash. Once in that situation the php installation routine cannot be rerun to correct the problem, so you effectively have a hosting lockout situation which can only be corrected by manual intervention.

up

down

-2 contrees.du.reve at gmail dot com ?9 years ago

Being able to put php directives in httpd.conf and have them work on a per-directory or per-vitual host basis is just great. Now there's another aspect which might be worth being aware of:

A php.ini directive put into your apache conf file applies to php when it runs as an apache module (i.e. in a web page), but NOT when it runs as CLI (command-line interface).

Such feature that might be unwanted by an unhappy few, but I guess most will find it useful. As far as I'm concerned, I'm really happy that I can use open_basedir in my httpd.conf file, and it restricts the access of web users and sub-admins of my domain, but it does NOT restrict my own command-line php scripts...

up

down

-3 nick at vistaworks dot net ?4 years ago

On Windows, as the documentation above states, you cannot set max_upload_filesize and post_max_size in the registry, because they are PHP_INI_PERDIR.

Confusingly, however, is the fact that phpinfo() will show your changes if you do add those to the regsitry, as if they were taking effect. However, the upload size is *not* changed, regardless of what phpinfo() reports.

I believe the reading of registry values and override happen 'too late' in the request processing, ie, after the file has already been uploaded and rejected.

In a perfect world, phpinfo() would recognize this and not report the overridden values, which is very confusing.

up

down

-4 Woody/mC ?9 years ago

@ pgl: As the documentation says:

"To clear a previously set value use none as the value."

Works fine for me.

up

down

-6 user at NOSPAM dot example dot com ?5 years ago

PHP Constants will work with php_value; for example:

php程序怎么部署运行

首先你要有windows2003和iis6.0(6.0以下就免谈了)。

然后要安装的东东依次为:php5.2,mysql5.0,phpmyadmin2.11

这些东西一个个去找实在是太麻烦了,幸好我们有wamp。

只要学会了安装wamp,那么就只剩下“配置”了。

下面所有牵涉到的文件路径都以wamp为准,php在wamp中的目录为wamp\bin\php\php5.2.5。

要让iis能够解析php,首先要把php.ini复制到c:\windows目录下,把php5isapi.dll复制到c:\windows\system32下。

然后从windows2003的管理工具中进入iis,新添加一个web服务扩展,扩展名可以任意填写,比如说“php服务扩展”,要求的文件则是php5isapi.dll,勾上“设置扩展状态为允许”。

然后新建一个网站,假设已经有了一个网站,右键“属性”,为网站创建一个“应用程序池”,执行权限为“脚本和可执行程序”,点击“配置”,添加一个

“应用程序扩展”,在新弹出的窗口中,可执行文件选择刚才的php5isapi.dll(最好是c:\windows\system32下的),”扩展

名”为.php,动作限制为“get,head,post,trace”,勾去“确认文件是否存在”

ok,这样php就基本上配置好了,可以去网站根目录下创建一个index.php,写入“

?php

phpinfo();?”,然后打开浏览器测试一下就可以了。

首先你必须修改php.ini,找到extension_dir这个参数,假设wamp安装在d盘,改成

extension_dir

=

“d:\wamp\bin\php\php5.2.5\ext\”,然后找到extension=php_mysql.dll和

extension=php_mysqli.dll,确保他们之前的逗号已经去掉。

接下就是关键了,在wamp\bin\php\php5.2.5目录下有一个关键的文件libmysql.dll,昨天困扰了许久,才想起以前配置

mysql的惨痛经历(都是wamp惹的祸,把php/mysql的安装搞的太简单了),这个文件一定要复制到c:\windows\system32目

录下去,否则就算在php.ini里面打开extension=php_mysql.dll也没有用,当浏览需要连接mysql的页面时,会报错说

“mysql”类型不存在。

我们就遇到了这样一个实际问题:54上已经在运行asp以及asp.net的网站,iis抢占了80端口,apache就不能使用了,这样难道你要别人在

单,在wamp中找到httpd.conf文件,将其中所有“80”字样替换成你想要的端口,重启apache就可以了。apache里面一共有4个地方

需要修改80:

listen

80,servername

localhost:80,namevirtualhost

*:80,前2个是默认的,后2个是配置了virtualhost才会出现。/pre

评论

加载更多

php网站搭建端口问题

打开iis管理器,设置对应网站的访问端口既可。这里端口不仅限于80,只要没被占用都可以设置,但是默认访问的端口是80

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门