php文件在执行过程中,可能会遇到“No input file specified”的错误信息,从字面来看,是没有找到输入文件的意思,而背后真正的原因可能会各不相同,总结一下我曾经遇到的一些情况。
一、php文件确实不存在
比如,webroot下没有名为a.php的文件,然后访问以下路径:http://localhost/a.php 。
如果以命令行方式运行一个不存在的php文件,会收到类似的错误信息:
PS C:\dev\php\code\core> php a.php
Could not open input file: aa.php
二、文件属主造成的没有执行权限问题
一般在linux桌面开发的时候会遇到这个问题,php以www用户运行,php项目检出之后的权限为:darkmi:darkmi,此时php文件是没有执行权限的。解决方案是,把当前用户的附加组增加www,命令如下:
usermod -a -G www darkmi
三、php配置造成的没有执行权限问题
在php.ini和user.ini中有个配置项为open_basedir,该配置项会限制php对本地文件系统的访问,即把所有的文件操作都限制指定的目录下。如果open_basedir指定的目录没有当前的项目目录,就会出现No input file specified的错误。
.user.ini 知识点补充
自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果。
除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER [‘DOCUMENT_ROOT’] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。
https://segmentfault.com/a/1190000011552335
问题描述
最近为我司系统接入某第三方服务,假设该第三方服务为W系统,使用https协议对外提供接口,访问W系统接口的时候,收到如下错误:
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://open.wwww.com/api/device/status": Received fatal alert: protocol_version; nested exception is javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:746)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:672)
根据日志提示,可猜测为SSL协议版本问题造成的异常。
问题分析
首先查看一下W系统支持的SSL协议版本
方法一:通过myssl.com网站
输出如下:
可知,W系统仅支持TLSv1.2。
以上工具地址为:SSL/TLS安全评估报告 (myssl.com)
More …macOS更新到 Catalina 10.15.4之后,原来显示隐藏文件的快捷键:Command + Shift + . 失效了,只能先用shell命令临时处理一下:
显示隐藏文件:
defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder
隐藏隐藏文件:
defaults write com.apple.finder AppleShowAllFiles -boolean false ; killall Finder
今天在分析nginx日志的时候,发现用户的请求中有如下格式的字符:
\xB6\xF1\xD2\xE2
而大部分用户提交的请求则是如下形式:
%E4%BC%98%E8%A1%A3%E5%BA%93
对于前者,使用以下python代码进行解码:
def decode_query_str():
str = b'\xB6\xF1\xD2\xE2'
print("{} ==》 {}".format(str, str.decode('GBK')))
执行结果:
b'\xb6\xf1\xd2\xe2' ==》 恶意
发生这种情况,可能的原因如下:
IE浏览器设置中有一个选项:”以UTF-8 形式发送URL路径”,当该选项有效时,IE将会对特殊字符进行UTF-8编码,同时进行URL编码。如果该选项无效,则使用默认编码”GBK”,并且不进行 URL编码。但是,对于URL后面的参数,则总是不进行编码,相当于UTF-8选项无效。比如: “中文.html?a=中文”, 当UTF-8选项有效时,将发送链接”%e4%b8%ad%e6%96%87.html?a=/x4e/x2d/x65/x87″; 而UTF-8选项无效时,将发送链接”/x4e/x2d/x65/x87.html?a=/x4e/x2d/x65/x87″。 在此注意,不管此选项是否有勾选,后面的参数都没有改变,改变的仅仅是地址。
对于后者,通过urldecode即可得到解码之后的数据,python代码如下:
def str_two():
str = '恶意'
print(urllib.parse.quote(str))
str = '%E6%81%B6%E6%84%8F'
print(urllib.parse.unquote(str))
TPS (transaction per second)代表每秒执行的事务数量,可基于测试周期内完成的事务数量计算得出。例如,用户每分钟执行6个事务,TPS为6 / 60s = 0.10 TPS。同时我们会知道事务的响应时间(或节拍),以此例,60秒完成6个事务也同时代表每个事务的响应时间或节拍为10秒。
利特尔法则 (Little’s law):
该法则由麻省理工大学斯隆商学院(MIT Sloan School of Management)的教授John Little﹐于1961年所提出与证明。它是一个有关提前期与在制品关系的简单数学公式,这一法则为精益生产的改善方向指明了道路。
利特尔法则的公式描述为:
Lead Time(产出时间)= 存货数量×生产节拍
或
TH(生产效率)= WIP(存货数量)/ CT(周期时间)
P.S: 稍后我们会列出负载模型中利特尔法则的应用公式。
我们通过2个示例来看一下此法则是如何在生产环境中发生作用的。
例1:假定我们所开发的并发服务器,并发的访问速率是:1000客户/分钟,每个客户在该服务器上将花费平均0.5分钟,根据little’s law规则,在任何时刻,服务器将承担1000×0.5=500个客户量的业务处理。假定过了一段时间,由于客户群的增大,并发的访问速率提升为2000客户/分钟。在这样的情况下,我们该如何改进我们系统的性能? 根据little’s law规则,有两种方案:
第一:提高服务器并发处理的业务量,即提高到2000×0.5=1000。 或者
第二:减少服务器平均处理客户请求的时间,即减少到:2000×0.25=500。
例2:假设你排队参观某个风景点,该风景点固定的容纳人数是:60人。每个人在该风景点停留的平均时间是:3分钟。假设在你的前面还排有20个人,问:你估计你大概等多少时间才能进入该风景点。
答案:1小时(3×20=60),和该景点固定的容纳人数无关。
为了通过利特尔法则研究负载模型,我们就先要了解两个因子:响应时间(Response time)和节拍(Pacing)。实际上节拍会超越响应时间对TPS的影响。
示例1:节拍0秒,思考时间0秒
用户执行5个事务并且每个事务的响应时间是10秒,需要花费50秒完成5个事务,即5/50=0.1 TPS (这里TPS是由响应时间控制)。
示例2:速率15秒,思考时间0秒
用户执行5个事务且每个事务的响应时间是10秒,但实际由于节拍大于响应时间,所以它优于响应时间控制了事务发生的频率。完成5个事务需要5*15 = 75秒,产生5/75=0.06667 TPS。
在第二个示例中,平均响应时间小于节拍15秒,需要75秒完成5个迭代,产生了0.06667 TPS。
上面两个例子中我们假设思考时间为0秒。如果思考时间为2秒,总时间仍是75秒完成5个迭代,产生0.06667 TPS。
节拍为0秒,则 用户数 = TPS * ( 响应时间 + 思考时间 )
节拍不为0秒且大于响应时间与思考时间的和,则 用户数 = TPS * (速率)
事实上TPS是事务在w.r.t时间的速率,所以也被称为吞吐量(throughput)。
所以利特尔法则在负载模型中解释为:系统内平均用户数 = 平均响应时间 * 吞吐量
N = ( R + Z ) * X
N, 用户数
R, 平均响应时间(也可能是速率)
Z, 思考时间
X, 吞吐量(如TPS)
如:N (用户数)=1500, R (平均响应时间)=10, Z (思考时间)=0,则X (吞吐量)=1500/10=150 TPS
来源:http://www.cnblogs.com/richardcuick/p/6384122.html
其他参考:
http://www.ha97.com/5095.html
w3lib 在pypi网站上的版本为1.21.0
https://pypi.org/project/w3lib/
使用以下命令安装之后:
pip install w3lib
发现安装的版本为:
w3lib==1.19.0
通过以下命令可以查看到是可以升级的:
pip list --outdated
所以指定版本号来安装一下:
pip install w3lib==1.21.0
Collecting w3lib==1.21.0
Using cached https://files.pythonhosted.org/packages/6a/45/1ba17c50a0bb16bd950c9c2b92ec60d40c8ebda9f3371ae4230c437120b6/w3lib-1.21.0-py2.py3-none-any.whl
Requirement already satisfied: six>=1.4.1 in d:\python\python36\lib\site-packages (from w3lib==1.21.0) (1.11.0)
ERROR: scrapy 1.5.1 requires Twisted>=13.1.0, which is not installed.
Installing collected packages: w3lib
Found existing installation: w3lib 1.19.0
Uninstalling w3lib-1.19.0:
Successfully uninstalled w3lib-1.19.0
Successfully installed w3lib-1.21.0
w3lib的官方主页:
https://github.com/scrapy/w3lib
w3lib的文档地址:
https://w3lib.readthedocs.io/en/latest/
gd扩展需要安装几个前置库,比如freetype、libpng等,此处把常用的库都安装一下。
使用yum安装常用库:
yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel
其中:
freetype
FreeType是一个完全开源的、可扩展、可定制且可移植的字体引擎,它提供TrueType字体驱动的实现统一的接口来访问多种字体格式文件,包括点阵字、TrueType、OpenType、Type1、CID、CFF、Windows FON/FNT、X11 PCF等。
官方网址:https://www.freetype.org
libjpeg
用来处理jpeg图片读写的库。
官方网址:http://libjpeg.sourceforge.net
libpng
https://libpng.sourceforge.io/index.html
用来处理png图片的库。
gmp
高精度数字计算库。
libmcrypt
加密库
readline
交互式命令库
安装完毕,进入php源码包的gd目录:
cd /root/php-5.6.14/ext/gd
在该命令下执行phpize:
/usr/local/php/bin/phpize
然后configure一下:
./configure –with-php-config=/usr/local/php/bin/php-config
然后执行 make & make install
make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
Installing header files: /usr/local/php/include/php/
然后把php.ini文件中添加:
extension=gd.so
重启php即可:
service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
在https://pecl.php.net 上搜索memcached,能够找到两个memcached扩展:
memcache
主页:https://pecl.php.net/package/memcache
memcache已经很久没有更新了。
memcached
主页:https://pecl.php.net/package/memcached
php-memcached的github地址:https://github.com/php-memcached-dev/php-memcached
版本比较新,支持php7,使用了libmemcached库,推荐使用。
nginx使用brew安装,信息如下:
brew info nginx
nginx: stable 1.13.12 (bottled), HEAD
HTTP(S) server and reverse proxy, and IMAP/POP3 proxy server
https://nginx.org/
/usr/local/Cellar/nginx/1.6.2 (7 files, 902KB)
Poured from bottle on 2014-12-18 at 21:03:14
/usr/local/Cellar/nginx/1.13.9 (23 files, 1.4MB)
Poured from bottle on 2018-03-11 at 11:01:32
/usr/local/Cellar/nginx/1.13.10 (23 files, 1.4MB) *
Poured from bottle on 2018-04-03 at 19:40:49
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/nginx.rb
==> Dependencies
Required: openssl ✔, pcre ✔
Optional: passenger ✘
==> Options
–with-passenger
Compile with support for Phusion Passenger module
–HEAD
Install HEAD version
==> Caveats
Docroot is: /usr/local/var/www
The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.
nginx will load all files in /usr/local/etc/nginx/servers/.
To have launchd start nginx now and restart at login:
brew services start nginx
Or, if you don’t want/need a background service you can just run:
nginx