php的json_encode和javascript的JSON.stringify不一致

一直用json-editor来做配置的界面,因为大部分的数据都是使用json的,前段在配合oneOf使用的时候, 发现新创建的内容,界面没有问题,保存的是没有问题,然后读取出来之后,显示的界面就一团糟了, 应该说对于读取的数据格式是属于哪一种字段解析错误了,所有的都只认oneOf的第一个。

最后反复调试,输出日志,发现在javascript侧的JSON数据结构比如空的字符串,在JSON.stringify后, 显示的是空字符串,eval解析回来还是空字符串,而相同的数据,在服务器的php侧,使用json_encode后, 空的字符串被替换成了null,然后json_decode的时候,出来的还是null,如果直接拿到客户端使用, 匹配的将是object的null,而不是string类型。在使用javascript侧进行eval了之后,出来的还是null, 与原始的数据不一致。

最后在将这段数据进行提交给服务器的时候,在客户端这边先进行JSON.stringify,服务器这边直接保存这个 字符串,然后json-editor的匹配就正常了

nginx 做laravel的https前代

前两天出去一趟,发现在国外竟然无法通过http连接国内的动态ip的服务器了,即使是非标准的都不可以,但https却无问题,那么,来加密吧。

弄了之后,发现了两个问题

  • 跳转的链接还是http的

这个在网上找了下,发现了下面的函数可以强制走https

URL::forceSchema("https");
  • 在登录后跳转到指定目标地址,自动转换为http了

经过不断的调试排错,最后发现是关于反向代理的时候,需要设置一个信任代理的列表,这个列表默认为空的,最简单的方式就是使用下面的,信任所有ip

Request::setTrustedProxies(['0.0.0.0/0']);

其他的关于nginx的配置,随便抄个就行

canphp小补丁一枚

我在应用中使用多级目录,但按照canphp的解析,函数名字中就带了’/’字符,比如/a/b/c,变成调用a::’b/c’这个函数,而b/c并不能作为一个函数声明,至少我不会 ::问题

通过分析canphp,在执行一步,函数会调用method_exists函数来确定是否存在函数,如果不 存在的话,则抛出异常

解决的方式

在php中存在一个__call函数,可以将函数拦截,转而调用真实的函数,我不精通php,不知 道在php中该如何称呼,我一般成为函数的拦截。

需要修改的地方

canphp文件core/cpApp.class.php中,下面的一处,小修改一下:

throw new Exception(self::$action."操作方法在" . $mo    dule . "模块中不存在");

修改后的代码:

try {
$object->$action();
} catch( Exception $e) {
 throw new Exception(self::$action."操作方法在" . $mo    dule . "模块中不存在");
}

使用的方法

比如/a/b/c,在aMod.class.php函数中,实现如下代码:

class aMod {
function startsWith($haystack, $needle)
         {
                     return $needle === "" || strpos($haystack, $needle) ===     0;
         }

function b_c_fun()
{
echo "call here";
}
function __call($method, $args)
{
if ($this->startsWidth($method, "b/c")) {
$this->b_c_fun();
}
}
}

nginx使用rewrite机制实现缓存

问题起始的需求

为了某个傻傻的想法,将所有的动态的页面变成静态页面。因为图像之类的保存位置也是在 数据库中,因此,这些统统都变成了php的访问请求

碰到的问题症状

进行了问题解决之后,发现图像之类的每次都需要从服务器上下载,这样对服务器的压力比 较大,而这些图片大部分都没有进行过任何更改

解决的思路

通过在服务器上创建一个缓存的文件,如果缓存文件不存在的时候,再请求php执行,在php 执行过程中,顺便将新的文件放置到缓存文件中,这样 下次的下次 的请求的时候,就会 出现文件未修改(服务器返回304),就不需要从服务器上再次下载了。

nginx的配置

if (!-f $latex request_filename) {
  rewrite "^/dev/getfile/(.+)$" /dev/getfile.php?$1& last;
 }

我在getfile.php中将所有允许缓存的文件都放在/dev/getfile目录下,因此,在请求时, 如果缓存文件存在的话,就不调用getfile.php文件,如果不存在的话,则调用getfile.php, 而在getfile.php中,会将不存在的文件重新创建到指定目录下,这样依赖,在 下次 调 用的时候,由于是新文件,则不调用getfile.php文件而重新传输,在 下次的下次 调用 的时候,文件未更改则不用重新传输了。

openwrt相关配置(2):http服务器相关配置

我的openwrt上运行的http服务器是nginx,相比lighthttp,nginx更高
效些,占用资源感觉更少些。对于自带的uhttp服务,只能保留,不然路由
器的网络界面就没办法进入了。如上篇所说,修改了默认的uhttpd服务器
端口号,这样nginx作为主要的http服务器界面出来了。

以下是nginx的相关配置,这里我将文件分开存放了,这样比较直观,
而且,配置的nginx,只支持一个站点,毕竟,路由器的资源很有限。

       user nobody nogroup;
       worker_processes  1;
       #error_log  logs/error.log;
       #error_log  logs/error.log  notice;
       #error_log  logs/error.log  info;
       #pid        logs/nginx.pid;
       events {
       worker_connections  1024;
       use epoll; #使用epoll,更高效,我在实际使用过程中,感受不到,获取是自己从来不曾注意
       multi_accept on;
       }

       http {
       include       mime.types;
       include wordpress.conf; #wordpress的相关配置,会引用php的配置文件
       default_type  application/octet-stream;
       sendfile        on;
       keepalive_timeout  65; #修改超时时间
       }
       

其他的内容都删除或者注释掉了。下面是核心的wordpress配置相关的
内容了:

继续阅读openwrt相关配置(2):http服务器相关配置