解决OwnCloud的No input file specified.错误

临关机睡觉前,总觉得不升级点什么睡不踏实。比如手机应用,电脑操作系统,IDE和浏览器插件之类的,都要点一圈保证是最新的。
结果今天发现没有可以更新的。。。不行,难受。那就看看Godday的host的PHP有没有新版本吧。

由于租用时间较早,当年还是PHP5.2的天下。结果PHP7都快过时了,服务器可选择的PHP版本仍然停留在PHP5。俗话说,世界上最好的PHP版本是PHP6(并没有6,直接从5到7),我退而求其次,升级到7还不行?毕竟在性能上有着天差地别。

于是乎满怀期待的点开了Program Language Version。呦,提供了
新版本 PHP5.6。行吧,总比没有强。于是痛快的选择了这个稍微高一点点的版本。

很快升级就完成了。按流程,依次点开各个服务进行回归测试。博客,正常。论坛,正常…………网盘,“No input file specified.”。糟糕了。

网盘用的是老牌私有云盘OwnCloud,网上能搜出的信息不算太多。
于是乎冷静下来,分析目前的情况。
首先,变化的只有PHP的版本,而且不是大版本变动。服务本身没有变动。
其次,其他服务,比如Wordpress等皆运行正常。

所以,推测是OwnCloud的PHP设置问题。
由于Godaddy为Shared Host,所以并不能直接修改PHP设置,而是要通过.htcaccess文件去实现基于路径的调整。随之,我找到了网盘的根目录,打开了.htcaccess。
留意到了如下片段

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
…………
</IfModule>

咦?我怎么记得RewriteEngine下面应该有个RewriteBase啊。
这小问题,于是顺手加上了“RewriteBase /”。保存。

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /
  RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
…………
</IfModule>

刷新之后,还是 “No input file specified.” 。哎呀?Wordpress的配置文件就是这么写的啊。然后又开始疯狂搜索信息,发现了很多在Godaddy上部署了Owncloud的受害者遇到过相同的问题,但是都没有找到答案。

看来还是得靠自己。经过一番努力地思考,难道因为是SharedHost,所以必须用绝对路径?而且由于当年不会给子域名加SSL,所以作为早期架起的服务,Owncloud并没有分配子域名,所以不该写根目录?
于是根据Goddady的Control Panel提供的绝对路径地址,拼上Owncloud的所在路径,写在了RewriteBase中。

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /XXXX/XXXX/XXX/99999999/html/cloud/owncloud5/
  RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
…………
</IfModule>

再次访问OwnCloud的URL,恢复正常。

总结,
1. RewriteEngine后面要接RewriteBase
2. 如果不是域名的根目录,要写全路径。
3. 如果相对路径不好用,尝试绝对路径。

PHP7什么时候才提供啊。。。GoDaddy!

.user.ini无法编辑的可能原因

今天给我的WP安装了Wordfence插件(人气安全插件),因为读书笔记用的Ngnix,所以并没有php.ini,只有.user.ini。好死不死插件要求更改此文件。

然后因为连我都无法编辑此文件,导致插件死活都开启不了防火墙。

然后我尝试了后台/在线编辑IDE/SSH,均无法更改权限到可编辑。

然后去了宝塔的后台安全管理溜达一圈,也没看到有关于这个文件的设定。

最后灵机一动,莫非。。。chattr。

果然,执行chattr -i .user.ini之后,权限就可以编辑了。插件功能顺利开启。

之后将权限重新设定成644,chattr +i .user.ini,打完收工。

那么chattr命令与.user.ini都是做什么的呢?之后补充。

关于随机数

在随机数这个问题上,一般程序员总是要经历下面的过程:

  1. 压根没有随机数的概念,想使用随机数的念头往往出于想每次执行自己辛辛苦苦写的小程序时可以有不一样的结果。
  2. 发现有个函数/方法是专门用来生成随机数的,试了一下,确实挺随机的。
  3. 兴高采烈的在自己的小程序里使用了这个函数/方法。结果发现每次结果其实还是一样的(C的话)
  4. 经历了千万次google才发现原来自己没加种子,只有不同的种子才会产生不同的随机数。往往种子都是使用一个恒定在变的东西——–时间。
  5. 当程序被高频访问的时候,问题又来了————-时间在计算里有最小单位,所以高频访问中临近访问的随机数是一样的。
  6. 又学会了一种叫随机数仓库的东西,来应对突然的高频访问。不断的往随机数队列里填充随机数,然后每个访问都是去随机数队列里去取。
  7. 然后,突然有一天,有人告诉你,这些不是随机数,最多只能称为伪随机数。

那么问题来了,什么是伪随机数,维基百科上的解释

伪随机性英语:Pseudorandomness)是指一个过程似乎是随机的,但实际上并不是。例如伪随机数(或称伪乱数),是使用一个确定性的算法计算出来的似乎是随机的数序,因此伪随机数实际上并不随机。在计算伪随机数时假如使用的开始值不变的话,那么伪随机数的数序也不变。伪随机数的随机性可以用它的统计特性来衡量,其主要特征是每个数出现的可能性和它出现时与数序中其它数的关系。伪随机数的优点是它的计算比较简单,而且只使用少数数值很难推算出计算它的算法。一般人们使用一个假的随机数,比如电脑上的时间作为计算伪随机数的开始值。

所以严格来讲,计算机生成的随机数并不是严格意义上的随机。那么我们如果想要真正的随机数怎么办呢。

有一个简便的方法,调用http://random.org的接口。

调用示例等参考此链接

 

Apache与Nginx

之前的服务器都是随大流使用的Apache,后来在新的备份服务器上美滋滋的想着尝试一下Nginx。
结果悲剧了。常用几个开源应用的.htaccess都是默认自带Apache语法的。尝试了一下网上的翻译器,并没有什么卵用。
小众者必然会死。。

// update

经过艰苦卓绝的训练。
技能【反向代理某搜索引擎】 Get。
技能【用Nginx进行负载平衡】 Get。

phpfreechat中一个啼笑皆非的Bug

因为觉得所有在线聊天工具要经过人家的服务器不够把握,所以在自己的服务器上架设了phpfreechat。
这款在线聊天室,有着不在服务器储存任何聊天记录的优点。

然后有一天,我试图在上面发送一个数字 0
没有任何反应。
习惯性的按了下F12,发现phpfreechat提供了控制台输出。

readyState: 4, responseText: "{ "error": "Wrong message format (must be a JSON string)" }", status: 400, statusText: "error"}

哦?必须是个Json?
又去下了一份源代码,查找报错内容 “Wrong message format (must be a JSON string)”。
顺利定位到唯一一本代码,channels.php中的如下代码片段。

  // check that request content contains a message
  $data = json_decode($req->getBody());
  if (!$data or !is_string($data)) {
    $res->status(400); // Wrong message format
    $res['Content-Type'] = 'application/json; charset=utf-8';
    $res->body('{ "error": "Wrong message format (must be a JSON string)" }');
    return;
  }

如果我在第二行传入了一个0,$data仍然等于0。
在第三行,死在了!$data上。!$data是个很诡异的判断。
在PHP中,非0即true,0即false,”0″是false,’0’也是false。
就因为我写了一个0,便中了招,进入了报错代码块。

我们再来看一下第三行代码的意图: 如果非(false/0/null/未初始化/””/…) 或者 不是字符串的话,报错。
可是我单独打一个0,并不应该被算作非法输入。
那么改成什么好呢?

Owncloud8以后版本如何直接从后台放文件

在Owncloud还年轻的时候,直接从后台上传文件到Owncloud的文件目录,会自动的归纳到文件系统里,并显示到网页上。
但自从Owncloud升级到高版本之后,这个特性就消失了。就是你可以放,但是人家就是不收录。

这个急坏了我了,因为有些文件通过正规上传功能就是死活上传不上去。这样我只能通过FTP先传到服务器上。
经过千辛万苦的尝试,有办法了。

第一种是执行Owncloud的CLI命令。具体位置是在Owncloud根目录,有个文件叫OCC,实际调用的是console.php,是个PHP脚本。通过命令 PHP OCC fils:scan –all即可重新扫描文件目录下的所有文件了。代价是所有文件的ID会重置,导致同步的桌面客户端会认为都是新文件,继而全部重新下载。不过,我不用同步客户端。。。。
在使用这种方法的时候我遇到了问题,因为Owncloud的Base.php使用了PHP5.4特性,虽然我在godday的管理页面选择了5.4,但在SSH中使用PHP命令的时候,仍然提示为PHP 5.3(Fxxk Godday)。

既然此路不通,我研究了下代码,发现了一个更简单的方式——–
[truncate oc_filecache;]命令
由于我使用的是MySql作为Owncloud的后台,就给了我操纵表的机会。。。执行之后,重新登录,文件都出来了。

// Update 1
答记者问,truncate命令要进入MySQL后台执行,truncate掉OwnCloud的oc_filecache这张表。之后重新登录OwnCloud,Owncloud系统会自动重新填充数据。

贴心的PHP:内置常量

用各语言做网站的同学,经常遇到的一个问题就是在不同操作系统下路径格式不同。有的必须用“\”,有的必须用“\\”,用的得用“/”之类的。如果我们的开发机和生产环境不是同一种操作系统,总是会遇到麻烦。

但PHP居然贴心的准备了两个内置常量,DIRECTORY_SEPARATOR与PATH_SEPARATOR。

用法很简单。

<?php
$path = join(DIRECTORY_SEPARATOR, array('root', 'lib', 'file.php');
?>

或者

<?php
require 'webroot' . DIRECTORY_SEPARATOR . 'index.php';
?>

之后PHP会自动的根据运行的系统将DIRECTORY_SEPARATOR替换成适当的符号。

但是有的同学说了,如果每次都要敲出这么长的一个常量好烦啊。那么我们可以这么做。Best Practice from CAKEPHP。

<?php
/**
 * Use the DS to separate the directories in other defines
 */
if (!defined('DS')) {
    define('DS', DIRECTORY_SEPARATOR);
}
?>

然后在地方就可以这样写了。

<?php
require 'webroot' . DS . 'index.php';
?>

如何在Windows下安装Composer

首先,没有那么复杂。参考这里

0. 确保PHP安装正确。验证方式为在CMD里执行php -v,如果看到了版本信息,继续。

1.下载composer.phar,然后放到PHP的安装目录里。与php.exe平级即可。

2.在此路径下新建一个脚本文件,叫做composer.bat。内容为

@php "%~dp0composer.phar" %*

3.重新打开一个CMD,执行composer –version,如果看到版本信息,打完收工。

// Update 20160812

其实Windows下直接就有安装包。。。尴尬。

// Update 20160812 2

下面代码可以解决获取package龟速的问题。供应商官网


composer config -g repo.packagist composer https://packagist.phpcomposer.com

目前已安装的插件

  1. CloudFlare | 1.3.24版本 | 由Ian Pye, Jerome Chen, James Greene, Simon Moore, David Fritsch, John Wineman (CloudFlare Team)创建

    我使用了CloudFlare的DNS加速服务,所以在WP里嵌入了这枚官方的插件。提供了一些可有可无的功能。
  2. CloudFlare Flexible SSL | 1.2.2版本 | 由iControlWP创建

    由于使用了CloudFlare的SSL,所以导致WP开始疯狂的重定向,所以使用这枚插件来解开重定向的死循环。
  3. Disable Google Fonts | 1.2版本 | 由Milan Dinić创建
    由于你懂的原因,google相关的域名都访问不了。好死不死的,WP的Core和主题都使用了google的字库。只能屏蔽之,否则页面会一直转圈到请求超时。
  4. SyntaxHighlighter Evolved< | 3.2.1版本 | 由Alex Mills (Viper007Bond)创建
    传说中的代码高亮,想贴代码的话就来一发吧。
  5. Autoptimize | 2.0.2版本 | 由Ian Pye, Jerome Chen, James Greene, Simon Moore, David Fritsch, John Wineman (CloudFlare Team)创建
    加速,加速,加速。
  6. WordPress Posts Timeline | 1.7版本 | 由Wylie Hobbs创建
    不实用,就是画一个时间轴,像Facebook里的一样,来显示文章的顺序。
  7. WP-PostViews | 1.73版本 | 由Lester ‘GaMerZ’ Chan创建
    能统计每篇文章都多少人看过,还有一个小边栏能列出人气榜。
  8. 你好多莉 | 1.6版本 | 由Matt Mullenweg创建
    WP自带的,能在后台显示一些台词。
  9. AMP | 0.4.2版本 | 由Automattic创建
    著名的AMP,优化移动页面,使你的移动设备访问速度飞起来。
  10. WP 统计 | 10.3版本 | 由Mostafa Soufi & Greg Ross创建
    用来统计访问数据的,可以看到国家浏览器访问的地址之类的。最好玩的是Chrome,我后台看起来。。。Chrome全家福简直不敢看。