PHPStorm 增加微信小程序代码提示

最近用美团的 Mpvue (没朋友)开发微信小程序,安装过程还算挺顺利。因为平时都是用 PHPstorm 开发项目,所以也就用这个IDE继续开发了。开发的时候遇到了小程序语法报错:

images

虽然实际运行没问题,但在页面中出现这些提示总觉得不爽。一番折腾后,终于找到了一个 weixin-app 的库:images

安装方法:

Preference -> Languages & Frameworks -> JavaScript

点击右边的 Download

找到 weixin-app,下载安装

回到项目中就可以看到已经没有错误提示了, 还增加了自动补全,对我这种懒人来说,实在是太好了

images

images

 

 

 

行到水穷处,坐看云起时

又到了一年的双十一,从 2009 年开始到现在已经第十年,到现在的销售额超过了去年的 1682 亿,今年肯定能达到 2000 亿,这真的就成了全民的狂欢节。由于太过热闹,最近几年对双十一的兴趣已经没有以前那么高了,不像在大学里那几年,每年双十一双十二前都乐此不疲地参加预热活动,研究各种所谓的自动刷红包攻略。现在活动的主战场变成了手机 APP,桌面端的刷红包也就都没用武之地了。去年这会儿还在博雅,正在参加雏鹰训练营,每天打着鸡血地忙来忙去,那是一段非常疯狂的日子,更加没有时间去买买买。

images

创业以来,似乎每天都很忙。也非常对不起女朋友,异地,平时还忙着工作,没啥时间陪她,她偶尔发发小脾气已经是对我最大的宽容了。

最近这两周,都在忙着第二波体验课,万里用一个多月的时间,找到了一种快速获取体验课流量的方法,当然中间遇到很多问题,按他的说法是,”这个漏斗漏得实在太多了”。上周一开始到昨天,我兼职当中教,每天上三到四节课,也是快要累趴。相比于第一次的体验课,我们做了很多的优化,无论是系统,课件还是外教,都超越了之前的水平,和外教们配合上课也是非常顺畅。

可是上天就是那么喜欢跟我们开玩笑。上次体验课,我们什么都没调整好,外教经常掉线,中途我们还更换了上课系统,上到最后我们自己都不好意思了。但是,最后却有四个孩子报了我们的正式课。而这次,我们什么都比上次好了,到现在却一个都没有报名。上周上课前,女朋友来了一句,”万一一个家长都没报名呢”,我当时回她:”不可能的”。现在看来,实在太不可思议了,我应该收回那句话。

经历了滑铁卢,我们当然不会这么就放弃,毕竟当初信誓旦旦要搞一番事情。把能优化的再优化一下,明天继续下一波体验。过去的这两周,就当做是送给泰州人民的礼物了。

 

定时重启 ssr 服务端

假设你的ShadowsocksR服务端安装在/root目录下。

crontab -e
# 打开定时任务设置

0 1 * * * /bin/bash /root/shadowsocksr/run.sh
# 添加每天凌晨1点0分 执行 run.sh 脚本(这个脚本相当于重启,因为会先检测是否有SSR服务端进程,如果有会先停止SSR进程然后再启动)

 

因为crontab 环境变量很坑,所以你需要修改一下 run.sh 脚本的环境变量设置。

vi /root/shadowsocksr/run.sh
# 打开 run.sh 脚本文件,并按 I键 进入编辑模式

 

把第一行的文本(带 # 号)

#!/bin/bash

 

改为(带 # 号)

#!/usr/bin/env bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

然后按ESC键退出编辑模式并输入:wq保存并退出。
做完这个还不行,你需要设置VPS的时区为 北京时区,否则定时任务会不准确。

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 可能会提示你是否覆盖,如果有提示就输入 y ,没有就不管。

 

然后输入date,看一下VPS系统时间是否和北京时间差不多(可能会有几分钟误差,不用管)
然后重启crontab,来让crontab读取系统当前的北京时区。

/etc/init.d/cron restart
#如果上面这个提示服务不存在,那就用下面这个
/etc/init.d/crond restart

 

等于说就是 设置crontab定时任务+修改 run.sh 脚本环境变量+修改系统时区为北京时区+重启crontab以同步时区为北京时区

PHP处理SOAP时报错failed to load external entity解决方案

之前在处理一个项目时,对方提供的是webservice接口,在本地测试接口正常,但是传到服务器后,就出现这这个错误。
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://***/soap/standard?wsdl' : failed to load external entity "http://***/soap/standard?wsdl"
in /localhost/api.php:31
解决方法:
在实例化SoapClient之间,加入这行代码
libxml_disable_entity_loader(false);
 
网上试过了一大堆方案,都不能正常解决,重启了nginx服务后,在短暂时间内没有问题,但是过了半个小时,又提示这个错误了。没办法,只好到Google上再找,最后试了这个方法后把问题解决了

PHP7 新特性,之前整理的

一、null合并运算符

常用到三元表达式某个值是否存在,存在就赋该值,不存在就赋默认值。
NULL 合并运算符使得变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。
//原来使用
$a = isset($_GET['mid']) ? $_GET['mid'] : 0;
//PHP7新特性
$b = $_GET['mid'] ?? 0;

二、define常量数组

PHP7之前,define常量的值仅允许标量和 null。标量的类型是 integer, float,string 或者 boolean。所以数组是不允许的
//之前要定义数组的方法,只能通过序列化和反序列化
$config = array('localhost', '127.0.0.1', 'user', 'pwd');
$seri = serialize($config); //或者是 json_encode($config);
define('DB_CONFIG', $seri);
//PHP7之后
define('CONFIG', $config);

三、加入整除

$a = intdiv(100, 3);
得到 $a = 33;

四、简化use使用

可以一次性引入同一namespace的类、函数、常量
//  PHP 7 之前用法
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
//PHP7之后
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};

五、太空船操作符(组合比较)

比较左右两个表达式,当左边小于、等于、大于右边的时候,分别返回的是-1 、0 、1
// 字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "c" <=> "a"; // 1
// 整型
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// 浮点型
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

六、增加返回值类型声明

增加了对返回类型声明的支持,返回类型声明指明了函数返回值的类型。
可以声明的返回类型有:
int float bool string interfaces array callable
function getResult($input): int
{
    return $input;
}
echo getResult(100.338);
返回 100

七、废弃了一些扩展

ereg mssql mysql sybase_ct

八、废弃的特性

在 PHP4 中类中的函数可以与类名同名,这一特性在 PHP7 中被废弃,同时会发出一个 E_DEPRECATED 错误。当方法名与类名相同,且类不在命名空间中,同时PHP5的构造函数(__construct)不存在时,会产生一个 E_DEPRECATED 错误。
class A {
    function A() {
        print('hello');
    }
}
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; A has a deprecated constructor in D:\testcode\test1.php on line 10

nginx 502 gateway 解决

images

fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;

fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

astcgi_buffer_size:用于指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选项指定的缓冲区大小。

fastcgi_buffers:指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为”16 16k”、”4 64k”等。

fastcgi_busy_buffers_size的默认值是fastcgi_buffers的两倍。

fastcgi_temp_file_write_size表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍。

图片粘贴上传插件

 

以前不喜欢在博客上写技术分享,基本都写在有道云笔记上。写技术分享,多多少少都需要贴图片,在笔记上直接粘贴截图就行,到了博客要把截图保存下来,然后传到 Media 这种操作实在太麻烦了,后来在网上找到了 ImagePaste-Modified 这款免费的插件,实在是太好用了,不用再一张一张地上传图片,看到就复制或者直接快捷键截图,到博客上粘贴就行。

博客用了阿里云oss,粘贴的图片也直接传到oss中,不担心存储的问题

源码地址:https://coding.net/u/pcdotfan/p/ImagePaste-Modified/git

 

images

MySQL 将 一行拆分为多个字段

上篇文章将多行合并成一行后已经可以直接从结果中阅读用户填写记录了,但是还是很麻烦,需要去分辨用户提交的内容属于什么。从网上发现了一个很实用的 函数 SUBSTRING_INDEX, 类似 PHP 中的 explode, 将字符串根据指定的字符分割开,提取我们想要的部分,直接拆分成多列。

 

SELECT
  reid,
  /*截取第一个字段*/
  SUBSTRING_INDEX( newdata, ',', 1 ) AS 姓名, 
  /*截取第二个字符*/
  SUBSTRING_INDEX(SUBSTRING_INDEX( newdata, ',', 2 ),',',- 1 ) AS 昵称,
  SUBSTRING_INDEX(
    SUBSTRING_INDEX( newdata, ',', 3 ),
    ',',- 1 
  ) AS 地址,
  SUBSTRING_INDEX(
    SUBSTRING_INDEX( newdata, ',', 4 ),
    ',',- 1 
  ) AS 备注
FROM
  (

  SELECT
    formid,
    reid,
    /*把所有的列合并到一行,通过 逗号 分割*/
    GROUP_CONCAT( DATA ) AS newdata 
  FROM
    (
    /*字段表联合结果表*/
    SELECT
      t_data.reid AS reid,
      t_data.`data`,
      t_data.type,
      t_field.title AS title,
      t_field.formid AS formid 
    FROM
      ims_rooit_class_data AS t_data
      LEFT JOIN ims_rooit_class_fields AS t_field ON t_data.fieldid = t_field.fieldid 
    WHERE
      t_field.type != 'timerange' 
    ) AS t_join 
  GROUP BY
  reid 
  ) AS t_join2

images

直接就是我们想要的显示方式,方便阅读

请我喝杯咖啡吧~

支付宝
微信