ENGINE=InnoDB;
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
ENGINE=InnoDB;
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
nginx
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
php
<?php
echo long2ip(_get_ip());
function _get_ip($full = false) {
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
if ($full == true)
return sprintf("%u\n", ip2long($_SERVER["HTTP_X_FORWARDED_FOR"]));
$tmp_ips = explode(',', $_SERVER["HTTP_X_FORWARDED_FOR"]);
$ip = array_shift($tmp_ips);
}
else if (isset($_SERVER["HTTP_CLIENT_IP"]))
$ip = $_SERVER["HTTP_CLIENT_IP"];
else if (isset($_SERVER["REMOTE_ADDR"]))
$ip = $_SERVER["REMOTE_ADDR"];
else if (getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("HTTP_CLIENT_IP"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
else
$ip = "Unknown";
return sprintf("%u\n", ip2long($ip));
}
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
进入application
php ../think build --config ..\build.php
build.php里面写需要生成的配置
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
安装supervisord
yum install epel-release
yum install -y supervisor
#yum -y install python-setuptools zlib
easy_install supervisor
echo_supervisord_conf > /etc/supervisord.conf
mkdir -p /data/etc/supervisord/
mkdir -p /data2/logs/supervisord/
chmod 777 /data2/logs/supervisord/
修改 /etc/supervisord.conf
sed -i -e "s#logfile=/tmp/supervisord.log#logfile=/data2/logs/supervisord/supervisord.log#g" /etc/supervisord.conf
sed -i -e "s#file=/tmp/supervisor.sock#file=/var/run/supervisor.sock#g" /etc/supervisord.conf
sed -i -e "s#pidfile=/tmp/supervisord.pid#pidfile=/var/run/supervisord.pid#g" /etc/supervisord.conf
sed -i -e "s#serverurl=unix:///tmp/supervisor.sock#serverurl=unix:///var/run/supervisor.sock#g" /etc/supervisord.conf
echo "[include]" >> /etc/supervisord.conf
echo "files = /data/www/supervisord/*.ini" >> /etc/supervisord.conf
操作脚本:
vi /usr/lib/systemd/system/supervisord.service
#输入下面内容,并保存
[Unit]
Description=Supervisord
After=network.target
[Service]
Type=forking
PIDFile=/var/run/supervisord.pid
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
[Install]
WantedBy=multi-user.target
保存
#修改权限
chmod +x /usr/lib/systemd/system/supervisord.service
systemctl enable supervisord.service
启用:systemctl start supervisord
#其它控制命令
systemctl stop supervisord
systemctl reload supervisord
查看进程列表:
systemctl status supervisord
#supervisorctl status
停止进程 mq_test_worker:
supervisorctl stop mq_test_worker:
开始进程 mq_test_worker::
supervisorctl start mq_test_worker:
启动程序如果提示:Starting supervisor: Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
unlink /var/run/supervisor.sock
sudo chmod 777 /run
sudo chmod 777 /var/log
sudo touch /var/run/supervisor.sock
sudo chmod 777 /var/run/supervisor.sock
supervisord -c /etc/supervisord.conf
ps aux | grep supervisord
最后效果
supervisord -c /etc/supervisord.conf 开启supervisord服务
supervisorctl start mq_test_worker 开启需要常驻的脚本服务
执行脚本test.php
然后tail -f mq_test_worker.log 里面可以看到队列的数据
代码附件 : msg_broker.zip
参考网站
RabbitMQ:https://www.cnblogs.com/fengyumeng/p/11133924.html
supervisord(碰到的坑):
https://www.missshi.cn/api/view/blog/5aafcf405b925d681e000000
https://www.cnblogs.com/ruanraun/p/supervisor.html
https://blog.csdn.net/weixin_41762173/article/details/88901970
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
CREATE TABLE afu.`test2` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
CREATE TABLE trade.`test2` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
<?php /** * Created by PhpStorm. * User: cuzn * Date: 2018/12/28 * Time: 19:10 */ namespace app\afu\cron\department; use app\afu\api\model\afu\Test2Model; use app\afu\api\model\trade\Test1Model; use PhpOffice\PhpSpreadsheet\Exception; require_once __DIR__ . '/../../conf/config.inc.php'; echo "exec at " . date('Y-m-d H:i:s') . "\n"; $Test1Model = Test1Model::getInstance(); function addTest2($isBack = false){ $Test2Model = Test2Model::getInstance(); try { $Test2Model->begin(); $ret = $Test2Model->insert([ 'name' => 'bbbbbbb' ]); if (!$isBack) { $Test2Model->commit(); return true; } else { $Test2Model->rollback(); return false; } } catch (Exception $e) { $Test2Model->rollback(); throw $e; //return false; } } try { $Test1Model->begin(); $ret = $Test1Model->insert([ 'name' => 'aaaaaa' ]); $ret2 = addTest2(false); var_dump($ret, $ret2); if ($ret && $ret2) { $Test1Model->commit(); }else { $Test1Model->rollback(); } } catch (Exception $e) { //addTest2(1); $Test1Model->rollback(); throw $e; }
function x1() { $x1 = db1("x1", 1); $x2 = db2("x2"); $x1->startTrans(); try { $x1->find(); $ret1 = $x1->where(['id' => 1])->update(['title' => "x1_11"]); if($ret1){ $x2->startTrans(); try { $x2->find(); $ret2 = $x2->where(['id' => 1])->update(['title' => "x1_111"]); if ($ret1 && $ret2) { dump(1); $x1->commit(); $x2->commit(); }else{ dump(2); $x1->rollback(); $x2->rollback(); } } catch (\Exception $e) { // 回滚事务 dump(3); $x1->rollback(); $x2->rollback(); echo "x2 : " . $e->getMessage(); } }else{ dump(4); $x1->rollback(); } } catch (\Exception $e) { // 回滚事务 dump(5); $x1->rollback(); echo "x1 : " . $e->getMessage(); } }
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
公司的一个项目需要在一个函数里面的调用多个函数,但是每个函数都用到了mysql事物,按照原生的mysql事物,只有一层
也就是说 A函数包含了B函数,如果B函数事物成功,A再没有commit的时候也能提交事物,这样就不对了
直接上代码
写一个class
定义一个静态变量
//事物laravel
static private $transactions = 0;
public function begin() { ++self::$transactions; if (self::$transactions == 1) { $sql = 'BEGIN'; $conn = $this->getMasterConn(); return DBMysqli::execute($conn, $sql); } } /** * 提交事务 * * @return bool * @throws Exception */ public function commit() { if (self::$transactions == 1) { $sql = 'COMMIT'; $conn = $this->getMasterConn(); return DBMysqli::execute($conn, $sql); } --self::$transactions; } /** * 回滚事务 * * @return bool * @throws Exception */ public function rollback() { if (self::$transactions == 1) { self::$transactions = 0; $sql = 'ROLLBACK'; $conn = $this->getMasterConn(); return DBMysqli::execute($conn, $sql); } else { --self::$transactions; } }
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
/** * 导出export 生成多个sheet * $data = [ * 'sheet1'=>[ * 'header'=>['k'=>v], * 'date'=>['k'=>v], * ] * 'sheet2'=>[ * 'header'=>['k'=>v] * 'data'=>['k'=>v] * ] * ] * header和data 用k 关联 * @param unknown $data * @param string $user * @param string $format * @param string $title * @return multitype:mixed */ public function multiExportSheet($data, $user = 'admin', $format = false, $title = ''){ require_once __DIR__.'/PHPExcel.php'; $objPHPExcel = new \PHPExcel(); $j = 0; foreach ($data as $dk=>$dv){ if($j==0){ $objPHPExcel->setActiveSheetIndex($j); //设置第一个工作表为活动工作表 $objPHPExcel->getActiveSheet()->setTitle($dk); //设置工作表名称 }else{ $msgWorkSheet = new \PHPExcel_Worksheet($objPHPExcel, $dk); //创建一个工作表 $objPHPExcel->addSheet($msgWorkSheet); //插入工作表 $objPHPExcel->setActiveSheetIndex($j); //切换到新创建的工作表 } $arrHeader = $dv['header']; $arrBody = $dv['data']; $newdata = []; $i = 0; foreach ($arrBody as $k=>$v){ foreach ($arrHeader as $kk=>$vv){ if(!empty($v[$kk])){ if($kk == 'idcard' || $kk == 'bank_card'){ $newdata[$i][$kk] = $v[$kk]."\t"; }else{ $newdata[$i][$kk] = $v[$kk]; } }else{ $newdata[$i][$kk] = ""; } } $i++; } $hd[0] = $arrHeader; $arrExcelInfo = array_merge($hd, $newdata); $objPHPExcel->getActiveSheet()->fromArray( $arrExcelInfo, // 赋值的数组 NULL, // 忽略的值,不会在excel中显示 'A1' // 赋值的起始位置 ); unset($arrExcelInfo); unset($hd); unset($arrHeader); unset($arrBody); unset($newdata); $j++; } $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $result=[]; $path = 'down/'.md5($user.'down').'/'; $rootPath = $this->mkdirPath($path); $date = date('YmdHis'); $title = $date.rand(10000,99999); $outputFileName = $rootPath.$title.".xlsx"; $objWriter->save($outputFileName); $result[]= str_replace(APP_PATH, '', $outputFileName); return $result; }
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权