分类 PHP+MYSQL 下的文章

一直以来,macos上的PHP开发环境除了常规的虚拟机姿势以外,系统自带的apache+php也是可选项之一

后来系统自带的PHP环境满足不了要求,又懒得倒腾虚拟机,采用了一个第三方一键脚本环境:https://php-osx.liip.ch/

用得挺身心的,一直到系统升级了了mojave的大版本,系统自带的apache版本和https://php-osx.liip.ch/的类库冲突,导致服务不能正常启动,解决版本就是卸载系统自带的apache,采用brew安装,那么既然重新装了,索性连PHP环境也整体更新吧,毕竟现在是7.X版本为主了,5.X都是一些历史项目兼容需要

过程记录如下:

  1. 首先确保系统brew已经安装且 brew update 后正常状态
  2. 卸载老版本的PHP,这一点php-osx比较好,删除/usr/local/php5 所在的软链和原文件夹即可
  3. 停止系统自带apache服务并卸载

    sudo apachectl stop
    sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null

  4. 通过brew安装apache

    brew install httpd

期间配置省略,附带若干常用命令

sudo brew services start httpd

sudo apachectl start
sudo apachectl stop
sudo apachectl -k restart
  1. 安装PHP环境,如果需要PHP5.X则需要额外支持

    brew tap exolnet/homebrew-deprecated
    2020年12月12 更新 ,因为openssl和icu4c的版本问题,上面这个包没有很好解决
    php@5.6 换下面的安装方式
    brew tap shivammathur/php
    brew install shivammathur/php/php@5.6

    安装PHP
    brew install php@5.6
    brew install php@7.1
    brew install php@7.2
    brew install php@7.3

安装顺序执行后的PHP版本是7.3的,如果我们要PHP5.X版本,则执行如下命令

brew unlink php@7.3 && brew link --force --overwrite php@5.6
  1. 在/usr/local/etc/httpd/httpd.conf 的如下地方加入以下配置

    LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
    LoadModule php5_module /usr/local/opt/php@5.6/lib/httpd/modules/libphp5.so
    #LoadModule php7_module /usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so
    #LoadModule php7_module /usr/local/opt/php@7.2/lib/httpd/modules/libphp7.so
    #LoadModule php7_module /usr/local/opt/php@7.3/lib/httpd/modules/libphp7.so

重启apache即可生效

最后如果我们要切换PHP版本
可以在/usr/local/bin 里面安装一个sphp可执行shell

$ curl -L https://gist.githubusercontent.com/rhukster/f4c04f1bf59e0b74e335ee5d186a98e2/raw > /usr/local/bin/sphp
$ chmod +x /usr/local/bin/sphp

确保sphp所在的bin目录在$PATH中,最后可以随意的切换了

在命令行中输入 sphp 7.3即可

本文参考翻译自https://getgrav.org/blog/macos-mojave-apache-multiple-php-versions

当你的程序莫名其妙的空白,好不容易输出错误的时候,显示“Call-time pass-by-reference has been removed”时,这基本可以确定是你辛苦搭建出来的web环境的php版本的问题了。

在php5.4的版本中,有一个:调用时引用传递已被废弃。当我们这样使用函数(或者类)的话,会产生一个error:foo(& $var);实际上,这样用本来就是错的,只是之前的错误级别仅仅是Deprecated而已。而正确的使用方法应该是在函数定义时:

function foo(& $var) {
}

而在调用时直接传参就行了: foo($var);

代码如下:

<input id="hidenTag" type="hidden"> <input class="long-input" style = "width:350px" type="text" name="tags" value="" id="tags" onfocus="clearInterval(auto);" onkeyup="$('#hidenTag').val(getCursorPosition(this));value=value.replace(/,/g,',');setCursorPosition(this,$('#hidenTag').val())" onblur="value=value.replace(/,{2,}/g,',');"> &nbsp;&nbsp;&nbsp;<a href="javascript:;" onclick="javascript:funQieci();">获取TAG分词</a>

在一个内部CMS中,会自动根据相关条件做分词处理,个别时候允许人工干预(就是手工设置tag分词),问题随之而来,用户会中英文混用输入','和',' ,而且删除时可能会留下两个逗号,所以多了几个处理

onkeyup="value=value.replace(/,/g,',');onblur="value=value.replace(/,{2,}/g,',');"

上面的代码能有效处理中英文逗号和多个逗号,但是一个副作用就是chrome浏览器下每一次onkeyup,光标都会置于最后一个位置,导致用户不能制止的误删tag分词。 寻得javascript代码如下:

//控制鼠标光标相关 function getCursorPosition (obj) {//获取光标位置函数 var CaretPos = 0;  // IE Support if (document.selection) { obj.focus (); var Sel = document.selection.createRange (); Sel.moveStart ('character', -obj.value.length); CaretPos = Sel.text.length; } // Firefox support else if (obj.selectionStart || obj.selectionStart == '0') CaretPos = obj.selectionStart; return (CaretPos); } function setCursorPosition(obj, pos){//设置光标位置函数 if(obj.setSelectionRange) { obj.focus(); obj.setSelectionRange(pos,pos); } else if (obj.createTextRange) { var range = obj.createTextRange(); range.collapse(true); range.moveEnd('character', pos); range.moveStart('character', pos); range.select(); } } 

原理就是每一次onkeyup获取当前光标位置,然后立马设置光标位置,但是setCursortPosition函数不能和getCursortPosition 套用,也就是不能这样使用

setCursorPosition(this,getCursorPosition(this))

所以采用一个隐藏的表单项传值 $('#hiddenTag'),进而每一次onkeyup先获取光标位置赋值到隐藏ID,然后执行过滤,然后设置光标位置,值为隐藏的ID的值。

鼠标广告js控制代码出处 http://www.js8.in/466.html

nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时候生效
最关键的一点事,在server的设置里面添加这一行:
listen 80 default;
后面的default参数表示这个是默认虚拟主机。

这个设置非常有用。
比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500.
目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦。就可以这样设置:
server {
listen 80 default;
return 500;
}

也可以把这些流量收集起来,导入到自己的网站,只要做以下跳转设置就可以:
server {
listen 80 default;
rewrite ^(.*) http://blog.tencn.net permanent;
}