参考网址
https://blog.csdn.net/weixin_43965143/article/details/106572755
https://www.jianshu.com/p/06521a9c75d8
js附件
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
参考网址
https://blog.csdn.net/weixin_43965143/article/details/106572755
https://www.jianshu.com/p/06521a9c75d8
js附件
声明:此文系舞林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)原创稿件,转载请保留版权
goTo:function (id) { const q =wx.createSelectorQuery(); q.select("#"+id).boundingClientRect(); q.selectViewport().scrollOffset(); q.exec((res)=>{ if(res[0] && res[1]){ console.log("跳转",res[0].top+res[1].scrollTop); wx.pageScrollTo({ scrollTop:res[0].top+res[1].scrollTop -100, duration:300 }) } }) }, setToView:function (room_id, bed_id) { var toView = 'room_bed_'+ room_id + '_' + bed_id; console.log("toView===", toView); this.setData({ toView: toView }); var self = this; setTimeout(function () { console.log("self.data.toView===", self.data.toView); self.goTo(self.data.toView); }, 1000); }
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
目录结构
@GOPATH
CREATE TABLE `userinfo` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL DEFAULT '',
`uid` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1.go
package main
import (
"conf"
"fmt"
// 或者
// myDbConf "conf"
)
func main() {
opend, db := conf.OpenDB()
//opend, db := myDbConf.OpenDB()
fmt.Println(db)
if opend {
fmt.Println("open success")
} else {
fmt.Println("open faile:")
}
// DeleteFromDB(db, 10)
//QueryFromDB(db)
//DeleteFromDB(db, 1)
//UpdateDB(db, 5)
conf.InsertToDB(db)
//myDbConf.InsertToDB(db)
//UpdateUID(db, 5)T
//UpdateTime(db, 4)
}
dbConf.go
package dbConfimport ("crypto/md5""database/sql""encoding/hex""fmt""strconv""time"_ "github.com/go-sql-driver/mysql")const (DB_Driver = "root:root@tcp(127.0.0.1:3306)/test?charset=utf8")func OpenDB() (success bool, db *sql.DB) {var isOpen booldb, err := sql.Open("mysql", DB_Driver)// fmt.Println(db)if err != nil {isOpen = false} else {isOpen = true}
CheckErr(err)
return isOpen, db}func InsertToDB(db *sql.DB) {uid := GetNowtimeMD5()// nowTimeStr := GetTime()stmt, err := db.Prepare("insert userinfo set name=?,uid=?")CheckErr(err)
res, err := stmt.Exec("wangbiao", uid)CheckErr(err)
id, err := res.LastInsertId()CheckErr(err)
if err != nil {fmt.Println("插入数据失败")} else {fmt.Println("插入数据成功:", id)}
}func QueryFromDB(db *sql.DB) {rows, err := db.Query("SELECT * FROM userinfo")CheckErr(err)
if err != nil {fmt.Println("error:", err)} else {}
for rows.Next() {var uid stringvar name stringCheckErr(err)
err = rows.Scan(&uid, &name)fmt.Println(name)
fmt.Println(uid)
}
}func UpdateDB(db *sql.DB, uid string) {stmt, err := db.Prepare("update userinfo set name=? where uid=?")CheckErr(err)
res, err := stmt.Exec("zhangqi", uid)affect, err := res.RowsAffected()fmt.Println("更新数据:", affect)CheckErr(err)
}func DeleteFromDB(db *sql.DB, id int) {stmt, err := db.Prepare("delete from userinfo where id=?")CheckErr(err)
res, err := stmt.Exec(id)affect, err := res.RowsAffected()fmt.Println("删除数据:", affect)}func CheckErr(err error) {if err != nil {panic(err)fmt.Println("err:", err)}
}func GetTime() string {const shortForm = "2006-01-02 15:04:05"t := time.Now()temp := time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), time.Local)str := temp.Format(shortForm)fmt.Println(t)
return str}func GetMD5Hash(text string) string {haser := md5.New()haser.Write([]byte(text))return hex.EncodeToString(haser.Sum(nil))}func GetNowtimeMD5() string {t := time.Now()timestamp := strconv.FormatInt(t.UTC().UnixNano(), 10)return GetMD5Hash(timestamp)}mysql.zip
声明:此文系舞林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; }
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权
Simple HTML
<input type="file" id="one-specific-file" name="one-specific-file">
Use as little as
$('#one-specific-file').ajaxfileupload({ action: '/upload.php' });
or as much as
$('input[type="file"]').ajaxfileupload({ action: '/upload.php', valid_extensions : ['md','csv'], params: { extra: 'info' }, onComplete: function(response) { console.log('custom handler for file:'); alert(JSON.stringify(response)); }, onStart: function() { if(weWantedTo) return false; // cancels upload }, onCancel: function() { console.log('no file selected'); }
});
jquery.ajaxfileupload.zip
参考网址 https://github.com/jfeldstein/jQuery.AjaxFileUpload.js
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权