Submitted by gouki on 2020, January 29, 4:21 AM
guzzlehttp库应该算是目前用的较多的HTTP请求库了吧。早些年我是一直用Requests,这两年都换成guzzle了。在使用代理 的时候要注意几点小事(各人的机器情况不一样)
1、如果用了v2ray在本地做代理 ,你使用guzzlehttp的时候。不能用 127.0.0.1 ,而是要用局域网的IP。嗯,自己写个脚本获取一下吧
2、sockets5的话,不能直接写socks,而是:socks5h
3、tcp这种好象现在不能用了。tcp://,会报协议错误。。根据实际情况换吧。如果是http就直接写http://xxxxx:port即可
记录一下,之所以用,是因为本地调用微信接口一直报IP不在白名单内,只有用代理 的方式,然后将代理IP加到白名单,也算一劳永逸吧
PHP | 评论:0
| 阅读:7618
Submitted by gouki on 2019, July 3, 2:40 PM
自从 laravel-china他们发了牢骚,说是镜像被人恶意引用,自己找不住了。果然这两天国内又增加了两个
1、https://mirrors.cloud.tencent.com/composer/ ,用法:
composer config -g repos.packagist composer https://mirrors.cloud.tencent.com/composer/
2、https://mirrors.aliyun.com/composer/index.html,用法:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
还没有测试,之前腾讯的我试过不行,所以继续 在用laravel-china的。不知道阿里怎么样。
#更新
腾讯云的还是不要用吧,我用composer update的时候,报错:https://mirrors.cloud.tencent.com/composer/p/provider-2013%2487216f389bc25a4f5d03d0cfb1a56cff043b3b3d9cb8faf4
1214c3001d51cb37.json 说是这个文件签名不符:The contents of https://mirrors.cloud.tencent.com/composer/p/provider-2013%2487216f389bc25a4f5d03d0cfb1a56cff043b3b3d9cb8faf4
1214c3001d51cb37.json do not match its signature.用浏览器打开一看,我靠,文件404,也不知道他是怎么做镜像的。哎。(放弃吧)
看了下laravel-china,他们申请不再提供了(即将)。然后他们也提供了一些镜像地址(网址是:https://learnku.com/composer/wikis/30594),比如:
安畅网络镜像
镜像类型:全量镜像
更新时间:1 分钟
镜像地址:https://php.cnpkg.org
官方地址:https://php.cnpkg.org/
镜像说明:此 Composer 镜像由安畅网络赞助,目前支持元数据、下载包全量代理。
交通大学镜像
镜像类型:非全量镜像
镜像地址:https://packagist.mirrors.sjtug.sjtu.edu.c...\
官方地址:https://mirrors.sjtug.sjtu.edu.cn/packagis...\
镜像说明:上海交通大学提供的 composer 镜像,稳定、快速、现代的镜像服务,推荐使用。
---EOF--
感谢这些平台为PHP开源世界做的贡献,就是不知道PHP还能走多远,或许下一步就是GO或者PYthon了。如果PHP只是用来做API(做CRUD),那么go和python短时间内肯定还不如php好用,但如果是做其他,比如爬虫类的,PHP就远远不行了(不是不能做,而且总差那么一口气,虽然我们在最早实现了PHP的工业化采集器,但真要用来做大型的,还是不够),其实这些年已经尝试半工业化了,比如实现PHP采集Server,队列,远程扔个规则上来,接下来就自动处理,多台机器读取队列等等。总还是没有象其他语言那样(我看情况是不是整理整理放出来,代码很垃圾)
Tags: composer
PHP | 评论:0
| 阅读:8714
Submitted by gouki on 2019, May 5, 6:59 AM
不喜用swoole,主要还是因为workerman是PHP版的,几乎不需要有什么额外的依赖。而Swoole则需要扩展。
调试阶段遇到和踩的一些坑在这里记录一下
1、因为reload不是重启,所以如果有一些文件需要reload,必须要onWorkStart里,不能在之前就include进来。否则无效
2、因为引入了Yii的queue,而Yii的queue,不是一个标准的controller,他只要调用过的Job,就会在内存里,所以只能通过exec(yii queue/run)之类的(当然,这本身也应该用supervisor或者systemd来进行管理)
3、无限reload:这个问题比较妖,我开始一直以为是官方例子里的last_time没有赋值或者赋值失败。所以测试了一些:
- $worker->reloadable = false,必须要为false
- 如果 Timer::add(3 , 'check_file_change'),如果这里是一个callable,那么死活就是无限reload(也可能是我方法不对?),直接我用Timer::add(3,function(){ ... })就正常了
4、官方有一个GlobalData的共享组件,如果你本身有redis之类的,就不要用了。当然他比较简单一些(反正他也不是什么分布式)
5、其他还有一些小坑,后续再说了
Tags: workerman
PHP | 评论:0
| 阅读:8958
Submitted by gouki on 2019, March 30, 9:26 AM
最近好象phpcomposer的镜像有点问题,有些JSON包好象都无法更新了。还出现了404,导致根本无法更新,建议先换成laravel-china.org的源吧
打开:dl.laravel-china.org,里面有配置。如果偷懒,这一句也行:
XML/HTML代码
- composer config -g repo.packagist composer https://packagist.laravel-china.org
Tags: composer
PHP | 评论:0
| 阅读:12362
Submitted by gouki on 2019, March 14, 8:29 PM
本文是利用nginx的proxypass来做代理到workerman创建的webserver上,从而使得github的git webhook可以起作用。
代码不复杂
1、准备一个composer.json,内容超短:
JavaScript代码
- {"name":"auto deploy","authors":[{"name":"gouki","email":"neatcn@qq.com"},"require":{"workerman/workerman":"dev-master"},"license":"MIT"]}
2、复制下面的代码,并赋予可执行权限(也可以不赋予,直接使用php xxx.php start 即可)
PHP代码
- #!/usr/bin/env php
- <?php
-
-
-
-
-
-
-
-
-
- use Workerman\Connection\ConnectionInterface;
- use Workerman\Worker;
-
- include __DIR__ . "/vendor/autoload.php";
-
-
-
- define('HTTP_SERVER', "http://0.0.0.0:8002");
-
- define('RUNTIME_PATH', __DIR__ . "/runtime/");
-
-
-
- Worker::$pidFile = RUNTIME_PATH . str_replace('/', '_', __FILE__) . ".pid";
-
- $config = [
- 'demo.neatstudio.com' => [
- 'target' => '/server/wwwroot/yzhan/neatstudio.com',
- 'secret' => '123456',
-
- 'keyword' => 'deploy',
- 'commands' => [],
- ]
- ];
-
- $worker = new Worker(HTTP_SERVER);
- $worker->count = 1;
- $worker->reloadable = false;
- $worker->onWorkerStart = function() {
- };
- $worker->onError = function(ConnectionInterface $connection) {
- $connection->close(resp_error_msg("ERROR", ['request' => func_get_args()]));
- };
-
- $worker->onMessage = function(ConnectionInterface $connection, $data) use ($config) {
-
- $server = $data['server'];
- if($server['CONTENT_TYPE'] === "application/x-www-form-urlencoded"){
- $post = json_decode($data['post']['payload'], true);
- } else{
- $post = $data['post'];
- }
- $repository = $post['repository']['name'] ?? "";
- $commitMsg = $post['head_commit']['message'] ?? "";
-
- if(!isset($config[$repository])){
- $connection->close(resp_error_msg('GIT资源未配置'));
- return;
- }
- $deployKeyword = $config[$repository]['keyword'];
-
- if($commitMsg && $deployKeyword && strpos($commitMsg, $deployKeyword) === false){
- $connection->close(resp_error_msg('未检测到关键字,不用部署'));
- return;
- }
-
-
-
- if(strpos($server['HTTP_USER_AGENT'], "GitHub-Hookshot/") === false ||
- $server['HTTP_X_HUB_SIGNATURE'] !== "sha1=" . hash_hmac('sha1', $GLOBALS['HTTP_RAW_REQUEST_DATA'], $config[$repository]['secret'])){
- $connection->close(resp_success_msg('数据校验失败'));
- return;
- }
-
- $ret = '';
-
- $commands = [
- "cd {$config[$repository]['target']} ",
- "git fetch --all",
- "git reset --hard origin/master",
- "./yii cache/flush-schema --interactive=0",
- ];
- $commands = array_merge($commands, $config[$repository]['commands'] ?? []);
- exec(join(" && ", $commands), $ret);
-
- $connection->close(resp_success_msg('更新成功', $ret));
- };
- Worker::$logFile = RUNTIME_PATH . "workerman.log";
- Worker::runAll();
-
- function resp_json($data, $message = '', $is_error = 0)
- {
- $result['status'] = 0;
- if($is_error){
- $result['error'] = $data;
- } else{
- $result['status'] = 1;
- $result['datas'] = $data;
- }
- $result['message'] = $message;
- return json_encode($result, JSON_UNESCAPED_UNICODE);
- }
-
- function resp_success($data)
- {
- return resp_json($data);
- }
-
- function resp_success_msg($message, $data = [])
- {
- return resp_json($data, $message);
- }
-
- function resp_error($data)
- {
- return resp_json($data, '', 1);
- }
-
- function resp_error_msg($message, $data = [])
- {
- return resp_json($data, $message, 1);
- }
是不是基本上控制 在100行内?因为访问量不会太大。所以我设置worker->count = 1,即,只启用一个子进程。
有人会说了,其实写一个PHP文件就可以了,设置为web目录指定一个域名不就完事了吗?是的,你说的这样其实也行,但有一点,如果你需要执行git命令还有使用exec命令,可能你的权限就不足了。而且。如果你的GIT是 采用root权限来git pull的。你拉回来的文件的owner都是root,这时候还需要执行chown -R www-data:www-data . 来处理,如果你是当成web项目来做,可能你就没有这个权限。
因此workerman就有了这样的功能。毕竟他是以root权限来运行的(也可以指定其他权限,如果指定非www-data[ubuntu/debian],你还得有权限设置目录的用户组)
-----
对比wallE和那个女娲系统,我这个是超级简单了。只有一个文件。而且不能远程操作(远程操作建议使用本程序+ansible),是不是也简单的够你用了,至少比以前写的 每分钟执行git pull一次好很多,workerman也支持多线程和多进程。性能也不差
PHP | 评论:0
| 阅读:9289