No input file specified问题修正

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


发表在 lnmpa | 留下评论

解决https接口无法访问的问题

问题描述

最近为我司系统接入某第三方服务,假设该第三方服务为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)

方法二:通过nmap命令

[root@as01-251-81 ~]# nmap --script ssl-enum-ciphers -p 443 open.wwww.com
Starting Nmap 7.70 ( https://nmap.org ) at 2022-06-28 11:34 CST
Nmap scan report for open.figps.com (120.55.18.63)
Host is up (0.010s latency).

PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (ecdh_x25519) - A
|       TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_128_CCM_8 (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_128_CCM (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|_  least strength: A

输出是一致的,也是仅支持TSLv1.2。

通过该命令查看阿里云接口支持的SSL协议:

[root@as01 ~]# nmap --script ssl-enum-ciphers -p 443 dypnsapi.aliyuncs.com
Starting Nmap 7.70 ( https://nmap.org ) at 2022-06-28 11:15 CST
Nmap scan report for dypnsapi.aliyuncs.com (106.11.45.35)
Host is up (0.029s latency).

PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   TLSv1.0: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (ecdh_x25519) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.1: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (ecdh_x25519) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|_  least strength: A

可以看到,阿里云接口支持多个版本的SSL协议。

接下来看一下客户端支持的协议版本,首先看一下JDK的版本:

[root@as01 ~]# java -version
java version "1.8.0_281"
Java(TM) SE Runtime Environment (build 1.8.0_281-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.281-b09, mixed mode)

jdk1.8支持的SSL协议版本:

TLSv1.2 (default)
TLSv1.1
TLSv1
SSLv3

来源:Diagnosing TLS, SSL, and HTTPS (oracle.com)

综上,客户端和服务的协议版本是能够匹配的,为什么会报protocol_version的异常还需要进一步探查。

接下来,通过在应用程序的启动命令中添加-Djavax.net.debug=all 打开网络调试日志,如下所示:

java -Xmx4096m -Xms4096m -jar -Djavax.net.debug=all /alidata0/wwwjava/myapp-dir/jar/myapp-name.jar --spring.profiles.active=prod

观察输出日志,发现在调用goeasy接口之前,对第三方系统调用的SSL协议有多个版本,在goeasy接口调用之后,所有其他第三方的接口调用的SSL协议版本都变成了TLSv1,观察握手部分的ClientHello即可:

*** ClientHello, TLSv1
RandomCookie: GMT: 1530541852 bytes = { 25, 106, 142, 179, 195, 87, 163, 223, 105, 170, 57, 91, 102, 15, 218, 48, 52, 167, 231, 83, 190, 177, 54, 27, 232, 111, 11, 140 }
Session ID: {}

继续看goeasy代码,发现其通过环境变量的方式强制设置了SSL协议版本为TSLv1:

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Accept-Charset", "utf-8");
conn.setRequestProperty("contentType", "utf-8");
conn.setConnectTimeout(CONNECT_TIMEOUT);
conn.setReadTimeout(READ_TIMEOUT);
if (PUBLISH_URL.startsWith("https://")) {
System.setProperty("https.protocols", "TLSv1");
TrustManager[] tm = {new PubSubX509TrustManager()};
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
SSLSocketFactory ssf = sslContext.getSocketFactory();
HttpsURLConnection httpsConn = (HttpsURLConnection) conn;
httpsConn.setSSLSocketFactory(ssf);
}

这个方式太暴力了,这也解释了为什么在解决该问题期间,不管是尝试在http客户端上设置SSL协议版本,还是在Springboot启动的时候,通过环境变量设置SSL协议版本,都是无效的原因。

曾尝试在http客户端工具上设置协议版本:

SSLContext ctx = SSLContexts.custom().useProtocol("TLSv1.2").build();
CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(new SSLConnectionSocketFactory(ctx)).build();

曾尝试在Springboot启动的时候,通过环境变量设置协议版本:

System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,TLSv1.0,SSLv3");

解决方案

找到问题原因,解决方案就好说了,把goeasy的版本从0.3.16升级到0.4.0,问题就解决了。查看升级之后的goeasy代码:

URL url = new URL(PUBLISH_URL);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Accept-Charset", "utf-8");
conn.setRequestProperty("contentType", "utf-8");
conn.setConnectTimeout(CONNECT_TIMEOUT);
conn.setReadTimeout(READ_TIMEOUT);
if (PUBLISH_URL.startsWith("https://")) {
    TrustManager[] tm = {new PubSubX509TrustManager()};
    SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
    sslContext.init(null, tm, new java.security.SecureRandom());
    SSLSocketFactory ssf = sslContext.getSocketFactory();
    HttpsURLConnection httpsConn = (HttpsURLConnection) conn;
    httpsConn.setSSLSocketFactory(ssf);
}

已经去掉了设置TSLv1的代码。

https://mvnrepository.com/artifact/io.goeasy/goeasy-sdk

背景知识

SSL是Secure Sockets Layer的缩写,TLS是Transport Layer Security的缩写。

SSL v1.0由于安全问题没有公开发布,SSL v2.0于1995年2月发布,但依然有安全问题,直到1996年的SSL v3.0发布,才修正这些问题。

TLS1.0是SSL v3.0的升级版,是更新、更安全的 SSL 版本,目前市面上所有的https都基于TLS。

以下是SSL/TLS的发布历史:

SSL 1.0 – never publicly released due to security issues.
SSL 2.0 – released in 1995. Deprecated in 2011. Has known security issues.
SSL 3.0 – released in 1996. Deprecated in 2015. Has known security issues.
TLS 1.0 – released in 1999 as an upgrade to SSL 3.0. Planned deprecation in 2020.
TLS 1.1 – released in 2006. Planned deprecation in 2020.
TLS 1.2 – released in 2008.
TLS 1.3 – released in 2018.

SSL和TLS这两个术语可以混用。一般在技术交流中会使用TLS,市场宣传中更多的用SSL,如下:

发表在 java/j2ee | 留下评论

mac下显示和隐藏文件

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
发表在 mac/iphone/ipad/android | 留下评论

python字符编码问题一则

今天在分析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))

发表在 python | 留下评论

TPS及计算方法

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

发表在 computer | 留下评论

w3lib安装记录

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/

发表在 python | 标签为 | 留下评论

如何关掉pycharm的拼写检查


在Settings页面,选择 Editor=》Inspections,在右侧取消Spelling和Typo的选中状态即可。

发表在 other | 标签为 | 留下评论

php安装gd扩展

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
发表在 lnmpa | 标签为 | 一条评论

为php安装memcached扩展

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库,推荐使用。

继续阅读

发表在 lnmpa | 标签为 , | 留下评论

mac下修改nginx的Docroot

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

继续阅读

发表在 lnmpa | 标签为 , , , | 留下评论