Valet 支持多版本下的PHP啦 。
brew tap nicoverbruggen/homebrew-cask
brew install --cask phpmon
膘叔的简单人生
Valet 支持多版本下的PHP啦 。
---自用
PHP有不少Redis库,比如pecl的Redis库(phpredis),就是直接自带了数组的存取和读出,因为他在存储和读出的时候自动序列化了。象是象predis就不行,如果你直接存一个数组去,那么它就会报warning,同时存一个Array到指定的KEY上。
但是predis允许你封装自定义的redis方法。比如jsonset/jsonget,这时候你利用这些自定义的方法来获取或写入数组即可。(基于Laravel,其他的也一样,其他参考:Setting arrays · Issue #136 · predis/predis (github.com))
只是官方的Issue中 【Predis\Profile\ServerProfile:】已经不存在了,要换成【Predis\Profile\Factory】,其余可以复制
----
基于Laravel的话,上述的数组可以放到config里,就啥出不用配置了~~
if (!function_exists('yredis')) {
class StringSetJson extends Predis\Command\StringSet
{
protected function filterArguments(array $arguments)
{
$arguments[1] = json_encode($arguments[1]);
return $arguments;
}
}
class StringGetJson extends Predis\Command\StringGet
{
public function parseResponse($data)
{
return json_decode($data, true);
}
}
class StringSetPhp extends Predis\Command\StringSet
{
protected function filterArguments(array $arguments)
{
$arguments[1] = serialize($arguments[1]);
return $arguments;
}
}
class StringGetPhp extends Predis\Command\StringGet
{
public function parseResponse($data)
{
return unserialize($data);
}
}
/**
* 这个方法是为了读redis,但是不含prefix
* @param string $connection
* @return RedisManager
*/
function yredis()
{
try {
$redis = app('yredis');
} catch (Exception $e) {
app()->singleton('yredis', function ($app) {
$config = $app->make('config')->get('database.redis', []);
unset($config['options']['prefix']);
if(env('REDIS_CLIENT') == 'predis'){
$config['options']['profile'] = function ($options, $option) {
$profile = \Predis\Profile\Factory::getDefault();
$profile->defineCommand('jsonset', 'StringSetJson');
$profile->defineCommand('jsonget', 'StringGetJson');
$profile->defineCommand('phpset', 'StringSetPhp');
$profile->defineCommand('phpget', 'StringGetPhp');
return $profile;
};
}
return new \Illuminate\Redis\RedisManager($app, \Illuminate\Support\Arr::pull($config, 'client', 'phpredis'), $config);
});
app()->bind('yredis.connection', function ($app) {
return $app['yredis']->connection();
});
$redis = app('yredis');
}
return $redis;
}
}
因为laravel的默认config会带 prefix,所以写一个简单的,其实就是为了在写数据的时候不加 prefix 。。。
着实意外,域名突然过期了,在续费的时候又遇上了订单卡住。然后解析在某一瞬间突然就被干掉。
由于我系统中的php是通过brew install 进行安装的。因此当遇到imap要使用的时候发现没法安装,因为我直接brew install php@7.4-imap无效。
作为一个外包,几乎要会所有的东西(肯定不可能精通),比如APP,之前APP简单的话就是APP套个壳,然后里面用webview。后面用UNIAPP,毕竟uniapp也能够做到自更新(self-update,即下载wgt,重启后就更新了)
网上很多教程都在教你怎么录屏,但没有说怎么停止。。。实话实说,为了停止它,真的查了不少资料。
为了方便开发,为navigatoTo和switchTab做了一个简单的封装,这样,其他开发人员就不用关心是跳到哪里去了。因为tab页只有5个(最大),所以优选用navigateTo,然后通过判断出错信息,再调用switchTab
然而就是在这个上面踩坑了。。。
开发者工具和IOS,在遇到tabbar页面的时候,出错信息是:{errMsg: "navigateTo:fail can not navigateTo a tabbar page"} ,毕竟,我是基于开发工具进行开发的,所以我直接偷懒。。。。。if (e.errMsg.includes('tabbar')),然后处理。
结果,在安卓上死活不能运行,我开始以为是url带了参数,去掉后发现还是不正常,于是我把出错信息打出来看一下,结果 发现,在android下,出错信息居然不一样。。它的出错信息是:{errMsg: "navigateTo:fail:can not navigate to a tab bar page"}。
看到不同点了么?
{errMsg: "navigateTo:fail can not navigateTo a tabbar page"}
{errMsg: "navigateTo:fail:can not navigate to a tab bar page"}
短短一行字,不同点居然有三处。。。我也是崩溃了,既然知道问题,那就好办了。无非就是判断 tabbar和tab bar了呗。只是,这种出错信息会不一致,让我很意外。。。
如题,其实官网已经给出过说明,就三句话:详见(项目结构 | Vuex (vuejs.org))
服务器上曾经偷懒过,比如用宝塔,但如果不想要个界面那就用lnmp会相对方便一点,主要是配置多环境PHP会相对容易