From e8bf3681dd51cd5027f64205b1fbc6b9e6a88ef2 Mon Sep 17 00:00:00 2001 From: hdk Date: Fri, 26 Feb 2021 21:36:34 +0800 Subject: [PATCH 1/3] go mod tidy --- go.mod | 7 +- go.sum | 200 --------------------------------------------------------- 2 files changed, 1 insertion(+), 206 deletions(-) diff --git a/go.mod b/go.mod index 25adfd8..2169c4e 100644 --- a/go.mod +++ b/go.mod @@ -10,13 +10,8 @@ require ( github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/kr/pretty v0.1.0 // indirect github.com/sirupsen/logrus v1.4.2 - github.com/stretchr/objx v0.2.0 // indirect - golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7 // indirect golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2 - golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect - golang.org/x/sys v0.0.0-20190912141932-bc967efca4b8 - golang.org/x/text v0.3.2 // indirect - golang.org/x/tools v0.0.0-20190912152909-b0a6c2aa3ffa // indirect + golang.org/x/sys v0.0.0-20190912141932-bc967efca4b8 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 diff --git a/go.sum b/go.sum index 9612ead..fabfd38 100644 --- a/go.sum +++ b/go.sum @@ -1,62 +1,15 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190910110746-680d30ca3117 h1:aUo+WrWZtRRfc6WITdEKzEczFRlEpfW15NhNeLRc17U= github.com/alecthomas/units v0.0.0-20190910110746-680d30ca3117/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antonfisher/nested-logrus-formatter v1.0.2 h1:t65eOqj0fWbOkZR2+OgmxPa0KYIwbPhKdYmseaCMIyI= -github.com/antonfisher/nested-logrus-formatter v1.0.2/go.mod h1:6WTfyWFkBc9+zyBaKIqRrg/KwMqBbodBjgbHjDz7zjA= github.com/chai2010/winsvc v0.0.0-20161110002403-fe57a9a621ec h1:zbWtLeEEAXSIpOUm1N4JCzBIcKFJ64ZczZNk/1vls38= github.com/chai2010/winsvc v0.0.0-20161110002403-fe57a9a621ec/go.mod h1:b9Xy0A0C/binZARjeVfHEr+gHzQUVztL71bTms7PRIM= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/joonix/log v0.0.0-20190524090622-13fe31bbdd7a h1:LL1gwNo4Z1LG68SaaNb8bxB+YnMSilYzytRfkF3AigE= -github.com/joonix/log v0.0.0-20190524090622-13fe31bbdd7a/go.mod h1:fS54ONkjDV71zS9CDx3V9K21gJg7byKSvI4ajuWFNJw= -github.com/jpillora/go-tcp-proxy v0.0.0-20190818024305-f42e8ed734f6 h1:BxJI+o9hhYoDUv7GhlPxT4ABVCjZkIIUPi2TY3mmMgI= -github.com/jpillora/go-tcp-proxy v0.0.0-20190818024305-f42e8ed734f6/go.mod h1:YYGX8P8Drrs+UnXo3/0XU4e0Xdjq8vvsOm89n+oJj40= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/kavu/go_reuseport v1.4.0 h1:YIp/96RZ3sJfn0LN+FFkkXIq3H3dfVOdRUtNejhDcxc= -github.com/kavu/go_reuseport v1.4.0/go.mod h1:CG8Ee7ceMFSMnx/xr25Vm0qXaj2Z4i5PWoUx+JZ5/CU= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= @@ -64,190 +17,37 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxv github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= -github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= -github.com/natefinch/npipe v0.0.0-20160621034901-c1b8fa8bdcce h1:TqjP/BTDrwN7zP9xyXVuLsMBXYMt6LLYi55PlrIcq8U= -github.com/natefinch/npipe v0.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:ifHPsLndGGzvgzcaXUvzmt6LxKT4pJ+uzEhtnMt+f7A= -github.com/novalagung/golpal v1.0.0 h1:33TidKDH6Jr7wwLrq/GvuZve67q+jJkeRty5pRrlPb8= -github.com/novalagung/golpal v1.0.0/go.mod h1:pOW1E6nhjAvi8l0wXkkJvKjbTKdyA29C40yjIL5XZcg= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/tidwall/evio v1.0.2 h1:vhPp5nVS5PZfR0CfV5ixqDEf+BKQFcaR1W1XeLLkvRE= -github.com/tidwall/evio v1.0.2/go.mod h1:cYtY49LddNrlpsOmW7qJnqM8B2gOjrFrzT8+Fnb/GKs= -github.com/uber-go/zap v1.10.0 h1:4pFX6Frb+nVIH8QS73XEiyPcKrJ/C25Z2xpudBIlOnE= -github.com/uber-go/zap v1.10.0/go.mod h1:GY+83l3yxBcBw2kmHu/sAWwItnTn+ynxHCRo+WiIQOY= -github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= -github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472 h1:Gv7RPwsi3eZ2Fgewe3CBsuOebPwO27PoXzRpJPsvSSM= -golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190902063713-cb417be4ba39/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20190830201351-c6da95954960/go.mod h1:mJOp/i0LXPxJZ9weeIadcPqKVfS05Ai7m6/t9z1Hs/Y= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2 h1:4dVFTC832rPn4pomLSz1vA+are2+dU19w1H8OngV7nc= golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190825160603-fb81701db80f h1:LCxigP8q3fPRGNVYndYsyHnF0zRrvcoVwZMfb8iQZe4= -golang.org/x/sys v0.0.0-20190825160603-fb81701db80f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 h1:ng0gs1AKnRRuEMZoTLLlbOd+C17zUDepwGQBb/n+JVg= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904005037-43c01164e931 h1:+WYfosiOJzB4BjsISl1Rv4ZLUy+VYcF+u+0Y9jcerv8= -golang.org/x/sys v0.0.0-20190904005037-43c01164e931/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd h1:DBH9mDw0zluJT/R+nGuV3jWFWLFaHyYZWD4tOT+cjn0= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190907184412-d223b2b6db03 h1:b3JiLYVaG9kHjTcOQIoUh978YMCO7oVTQQBLudU47zY= -golang.org/x/sys v0.0.0-20190907184412-d223b2b6db03/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190912141932-bc967efca4b8 h1:41hwlulw1prEMBxLQSlMSux1zxJf07B3WPsdjJlKZxE= golang.org/x/sys v0.0.0-20190912141932-bc967efca4b8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190903163617-be0da057c5e3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190905235650-93dcc2f048f5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190912152909-b0a6c2aa3ffa/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69 h1:4rNOqY4ULrKzS6twXa619uQgI7h9PaVd4ZhjFQ7C5zs= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190905072037-92dd089d5514/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= From d7c94b744dc1e2b51ee38a59d47b1dfc11c00467 Mon Sep 17 00:00:00 2001 From: hdk Date: Thu, 4 Mar 2021 15:02:21 +0800 Subject: [PATCH 2/3] release timeout idle php-cgi process and set MaxRequestPerProcess default as 5000 --- conf/conf.go | 8 +- main.go | 39 ++++-- phpfpm/phpfpm.go | 349 ++++++++++++++++++++++++++++++++-------------- phpfpm/process.go | 33 +++-- server/sever.go | 3 + 5 files changed, 303 insertions(+), 129 deletions(-) diff --git a/conf/conf.go b/conf/conf.go index b1a41d4..0c7378e 100644 --- a/conf/conf.go +++ b/conf/conf.go @@ -20,10 +20,14 @@ type Instance struct { ExecPath string `json:"ExecPath"` Args []string `json:"Args"` Env []string `json:"Env"` - // MaxRequestsPerProcess 每個php-cgi行程最多能夠處理幾次要求 , Default 500 - MaxRequestsPerProcess int `json:"MaxRequestsPerProcess,500"` + // MaxRequestsPerProcess 每個php-cgi行程最多能夠處理幾次要求 , Default 5000 + MaxRequestsPerProcess int `json:"MaxRequestsPerProcess,5000"` // MaxProcesses 定義 Instance 啟動 php-cgi 的最大數量,default 4 MaxProcesses int `json:"MaxProcesses,4"` + // MaxProcesses 定義 Instance 啟動 php-cgi 的最大數量,default 2 + MinProcesses int `json:"MinProcesses,2"` + // IdleTimeout 回收空闲时间超过 IdleTimeout 秒的进程,default 20s, set 0 to disable + IdleTimeout int `json:"IdleTimeout,20"` // Note 只是註解,此欄位沒有任何作用 Note string `json:"-"` } diff --git a/main.go b/main.go index 5a16040..141c1bc 100644 --- a/main.go +++ b/main.go @@ -30,6 +30,7 @@ var ( flagConfigFile *string servers []*server.Server + // phpfpmInst []*phpfpm.Instance ) func main() { @@ -130,16 +131,12 @@ func startService() { fmt.Printf("Start in console mode , press CTRL+C to exit ...\r\n") initLogger(config) - err = phpfpm.Start(config) - if err != nil { - log.Fatalf("Can not start service : %s\n", err.Error()) - } var events server.Event events.OnConnect = func(c *server.Conn) (action server.Action) { - - p := phpfpm.GetIdleProcess(c.Server().Tag.(int)) + pool := c.Server().PhpfpmPool + p := pool.GetIdleProcess() if p == nil { if log.IsLevelEnabled(log.ErrorLevel) { @@ -153,12 +150,12 @@ func startService() { log.Debugf("php-cgi(%s) proxy error , serr : %s , terr : %s", p.ExecWithPippedName(), serr, terr) } - phpfpm.PutIdleProcess(p) + pool.PutIdleProcess(p) return } - conf := phpfpm.Conf() + conf := config var wg sync.WaitGroup @@ -168,7 +165,23 @@ func startService() { for i := 0; i < len(conf.Instances); i++ { instance := conf.Instances[i] - servers[i] = &server.Server{MaxConnections: instance.MaxProcesses, BindAddress: instance.Bind, Tag: i} + phpfpmInst := phpfpm.NewPhpFpmInstance(i, instance) + + if err != nil { + log.Fatalf("Can not start service : %s\n", err.Error()) + } + + err = phpfpmInst.Start() + if err != nil { + log.Fatalf("Can not start service : %s\n", err.Error()) + } + + servers[i] = &server.Server{ + MaxConnections: instance.MaxProcesses, + BindAddress: instance.Bind, + Tag: i, + PhpfpmPool: phpfpmInst, + } log.Infof("Start server #%d on %s", i, servers[i].BindAddress) @@ -194,7 +207,6 @@ func startService() { }() wg.Wait() - phpfpm.Stop() log.Info("Service Stopped.") } @@ -203,6 +215,7 @@ func stopService() { for i := 0; i < len(servers); i++ { servers[i].Shutdown() + servers[i].PhpfpmPool.Stop() } } @@ -271,6 +284,12 @@ func initLogger(config *conf.Conf) { log.Warnf("Instance #%d MaxProcesses is less 1 , set to 4", i) config.Instances[i].MaxProcesses = 4 } + + if config.Instances[i].IdleTimeout < 5 { + //Repair MaxProcesses + log.Warnf("Instance #%d IdleTimeout is less than 5s , set to 120s", i) + config.Instances[i].IdleTimeout = 120 + } } } diff --git a/phpfpm/phpfpm.go b/phpfpm/phpfpm.go index 5f48eef..64d0bf6 100644 --- a/phpfpm/phpfpm.go +++ b/phpfpm/phpfpm.go @@ -1,8 +1,8 @@ package phpfpm import ( - "container/list" "sync" + "time" "wphpfpm/conf" log "github.com/sirupsen/logrus" @@ -10,157 +10,290 @@ import ( // Instance : struct type Instance struct { - execPath string - args []string - env []string - processes []Process -} - -var ( - // conf 是 json 讀進來後產生的設定 - phpfpmConf *conf.Conf - // idleProcesses php-cgi 如果沒有任何連線處理,都存在這 - idleProcesses []*list.List - stopManage = false // 如果調用 Stop() , 這個會是 true , 同時 mon() 也不會繼續監控 + // execPath string + // args []string + // env []string + // processes []Process + idleProcesses []*Process // php-cgi 如果沒有任何連線處理,都存在這 + processes []*Process + stopManage bool // 如果調用 Stop() , 這個會是 true , 同時 mon() 也不會繼續監控 mutex sync.Mutex -) -// Conf : get Json config -func Conf() *conf.Conf { - return phpfpmConf + conf conf.Instance + instanceIndex int +} + +// NewPhpFpmInstance New PhpFpm Instance +func NewPhpFpmInstance(instanceIndex int, conf conf.Instance) *Instance { + return &Instance{ + conf: conf, + instanceIndex: instanceIndex, + } } // Start php-cgi manager -func Start(conf *conf.Conf) (err error) { +func (inst *Instance) Start() (err error) { log.Info("phpfpm starting.") - phpfpmConf = conf - instanceLen := len(conf.Instances) - idleProcesses = make([]*list.List, instanceLen) - for i := 0; i < instanceLen; i++ { - idleProcesses[i] = list.New() - - for j := 0; j < conf.Instances[i].MaxProcesses; j++ { - instance := conf.Instances[i] - p := newProcess(instance.ExecPath, instance.Args, instance.Env) - p.instanceIndex = i - err := p.TryStart() - if err == nil { - mutex.Lock() - p.mapElement = idleProcesses[i].PushBack(p) - mutex.Unlock() - go monProcess(p) - } else { - Stop() - return err - } + inst.idleProcesses = make([]*Process, 0, inst.conf.MaxProcesses) + inst.processes = make([]*Process, 0, inst.conf.MaxProcesses) + + for j := 0; j < inst.conf.MinProcesses; j++ { + err := inst.createAndPushProcess() + if err != nil { + inst.Stop() + return err } } + + // 回收多余的空闲进程 + if inst.conf.IdleTimeout > 0 { + go inst.release(time.Duration(inst.conf.IdleTimeout) * time.Second) + } + log.Info("phpfpm is in loop.") return } +func (inst *Instance) createAndPushProcess() (err error) { + + p1 := newProcess(inst.conf.ExecPath, inst.conf.Args, inst.conf.Env) + + log.Infof("Starting php-cgi(%s)", p1.ExecWithPippedName()) + + err = p1.TryStart() + if err != nil { + log.Errorf("Starting php-cgi(%s) error, because: %v", p1.ExecWithPippedName(), err) + return err + } + + go inst.monProcess(p1) + + inst.mutex.Lock() + if len(inst.processes) < inst.conf.MaxProcesses { + p1.inPool = true + inst.processes = append(inst.processes, p1) + } + inst.mutex.Unlock() + + p1.TouchIdleTime() + inst.pushToIdle(p1) + + log.Infof("Started php-cgi(%s), processes: %d, idleProcesses: %d", p1.ExecWithPippedName(), len(inst.processes), len(inst.idleProcesses)) + + return err +} + // monProcess 監控 php-cgi 狀態是否跳出 -func monProcess(p *Process) { +func (inst *Instance) monProcess(p *Process) { log.Infof("Starting monitor php-cgi(%s)", p.ExecWithPippedName()) defer log.Infof("Stopped monitor php-cgi(%s)", p.ExecWithPippedName()) - for { - err := p.cmd.Wait() - if p.requestCount >= phpfpmConf.Instances[p.instanceIndex].MaxRequestsPerProcess { - err = p.TryStart() - if err != nil { - p.restartChan <- false - } else { - p.restartChan <- true - } - continue - } - if err != nil { - log.Errorf("php-cgi(%s) exit error, because %s", p.ExecWithPippedName(), err.Error()) - } + err := p.cmd.Wait() - mutex.Lock() + p.closed = true + inst.remove(p) - if stopManage { - // 執行 phpfpm.Stop() 代表不需要再監控了 - mutex.Unlock() - return - } - - idleProcesses[p.instanceIndex].Remove(p.mapElement) - err = p.TryStart() + p.inUse = false + if !inst.stopManage && !inst.isStale(p) { + inst.createAndPushProcess() + } - if err != nil { - // 退出監控 - log.Errorf("php-cgi(%s) restart error, because %s", p.ExecWithPippedName(), err.Error()) - mutex.Unlock() - return - } - // 啟動成功 - p.mapElement = idleProcesses[p.instanceIndex].PushBack(p) - mutex.Unlock() - if log.IsLevelEnabled(log.InfoLevel) { - log.Infof("php-cgi(%s) restart successfully.", p.ExecWithPippedName()) - } + if log.IsLevelEnabled(log.InfoLevel) { + log.Debugf("php-cgi(%s) is exited , because : %v", p.execWithPippedName, err) } } // Stop php-cgi manager , 所有的 process kill -func Stop() { +func (inst *Instance) Stop() { log.Info("phpfpm stoping.") - stopManage = true - mutex.Lock() - defer mutex.Unlock() - - var next *list.Element - - for _, v := range idleProcesses { - for e := v.Front(); e != nil; e = next { - next = e.Next() - p := e.Value.(*Process) - p.Kill() - v.Remove(e) - } + inst.stopManage = true + inst.mutex.Lock() + defer inst.mutex.Unlock() + for _, p := range inst.processes { + p.Kill() } log.Info("phpfpm stopped.") } // GetIdleProcess : 取得任何一個 Idle 的 Process , 並且移除 Idle 列表 -func GetIdleProcess(instanceIndex int) (p *Process) { - mutex.Lock() - defer mutex.Unlock() - e := idleProcesses[instanceIndex].Front() - if e != nil { - p = idleProcesses[instanceIndex].Remove(e).(*Process) - p.mapElement = nil +func (inst *Instance) GetIdleProcess() (p *Process) { + p = inst.popupIdle() + + if p == nil { + if len(inst.processes) < inst.conf.MaxProcesses { + inst.createAndPushProcess() + return inst.GetIdleProcess() + } + return + } + + if p.closed { + p = nil + return inst.GetIdleProcess() } + p.inUse = true return } // PutIdleProcess : 設定 Process 為 idle -func PutIdleProcess(p *Process) (err error) { +func (inst *Instance) PutIdleProcess(p *Process) (err error) { + if inst.stopManage { + return + } - mutex.Lock() - defer mutex.Unlock() if p.pipe != nil { err = p.pipe.Close() p.pipe = nil } + p.TouchIdleTime() - if p.requestCount >= phpfpmConf.Instances[p.instanceIndex].MaxRequestsPerProcess { - log.Warnf("php-cgi(%s) handled %d requests , need restart.", p.execWithPippedName, p.requestCount) + if inst.isStale(p) { + log.Warnf("php-cgi(%s) isStale, handled %d requests , need release.", p.execWithPippedName, p.requestCount) + inst.remove(p) p.Kill() - if true == <-p.restartChan { - p.mapElement = idleProcesses[p.instanceIndex].PushBack(p) - } else { - log.Errorf("php-cgi(%s) restart faild.", p.execWithPippedName) + if p.inPool { // && len(inst.processes) < inst.conf.MaxProcesses + go inst.createAndPushProcess() } - } else { - p.mapElement = idleProcesses[p.instanceIndex].PushBack(p) - if log.IsLevelEnabled(log.DebugLevel) { - log.Debugf("php-cgi(%s) is idle , requests count : %d", p.execWithPippedName, p.requestCount) + p = nil + return + } + + inst.pushToIdle(p) + if log.IsLevelEnabled(log.DebugLevel) { + log.Debugf("php-cgi(%s) is idle , requests count : %d", p.execWithPippedName, p.requestCount) + } + + return +} + +// checkMinIdleConns 检查是否有足够的空闲进程 +func (inst *Instance) checkMinIdleProcess() { + + if inst.stopManage { + return + } + + if len(inst.processes) >= inst.conf.MinProcesses { + return + } + + inst.createAndPushProcess() + +} + +// release 回收空闲进程 +func (inst *Instance) release(d time.Duration) { + ticker := time.NewTicker(d) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + if inst.stopManage { + return + } + + log.Infof("time Ticker: php-cgi processes: %d, idleProcesses: %d", len(inst.processes), len(inst.idleProcesses)) + inst.checkMinIdleProcess() + inst.checkStaleProcess() + } + + } + +} + +// checkStaleProcess 检查并回收可回收进程 +func (inst *Instance) checkStaleProcess() { + inst.mutex.Lock() + if len(inst.idleProcesses) == 0 { + inst.mutex.Unlock() + return + } + p := inst.idleProcesses[0] + inst.mutex.Unlock() + + if p == nil { + log.Infof("inst.idleProcesses[0] is nil") + return + } + if !inst.isStale(p) { + return + } + + inst.remove(p) + p.Kill() + + log.Infof("php-cgi processes %s , isStale, released", p.pippedName) + return +} + +// isStale 是否可回收 +func (inst *Instance) isStale(p *Process) bool { + // return p.requestCount >= inst.conf.MaxRequestsPerProcess || + // !p.inPool || + // p.IdleAt().Before(time.Now().Add(-time.Duration(inst.conf.IdleTimeout))) + + defer func() { + err := recover() + if err != nil { + log.Infof("isStale PANIC: %v, %v", p, err) } + }() + + if p.inUse { + return false + } + if !p.inPool || p.closed { + return true + } + if p.requestCount >= inst.conf.MaxRequestsPerProcess { + return true + } + if p.IdleAt().Before(time.Now().Add(-time.Duration(inst.conf.IdleTimeout) * time.Second)) { + return true + } + return false +} + +// Remove : 移除 +func (inst *Instance) remove(p *Process) { + + inst.mutex.Lock() + defer inst.mutex.Unlock() + + if p == inst.idleProcesses[0] { + inst.idleProcesses = inst.idleProcesses[1:] } + + for i, c := range inst.processes { + if c == p { + inst.processes = append(inst.processes[:i], inst.processes[i+1:]...) + return + } + } + +} + +func (inst *Instance) pushToIdle(p *Process) { + inst.mutex.Lock() + inst.idleProcesses = append(inst.idleProcesses, p) + inst.mutex.Unlock() +} + +func (inst *Instance) popupIdle() (p *Process) { + inst.mutex.Lock() + if len(inst.idleProcesses) == 0 { + inst.mutex.Unlock() + return + } + + idx := len(inst.idleProcesses) - 1 + p = inst.idleProcesses[idx] + inst.idleProcesses = inst.idleProcesses[:idx] + // inst.idleProcessesLen-- + // p.checkMinIdleConns() + inst.mutex.Unlock() + return } diff --git a/phpfpm/process.go b/phpfpm/process.go index 0a6b73f..25c7015 100644 --- a/phpfpm/process.go +++ b/phpfpm/process.go @@ -1,13 +1,13 @@ package phpfpm import ( - "container/list" "io" "net" "os" "os/exec" "strconv" "sync" + "sync/atomic" "time" log "github.com/sirupsen/logrus" @@ -16,14 +16,12 @@ import ( // Process : struct type Process struct { - execPath string - args []string - env []string - cmd *exec.Cmd - instanceIndex int // 這個是在 phpfpm.go 中的 idleprocess 連結用的 , 代表這個 Process 是屬於那個 Instance - mapElement *list.Element - pipe *npipe.PipeConn - pippedName string // php-cgi 執行時指定的 pipped name + execPath string + args []string + env []string + cmd *exec.Cmd + pipe *npipe.PipeConn + pippedName string // php-cgi 執行時指定的 pipped name requestCount int // 紀錄當前執行中的 php-cgi 已經接受幾次要求了 @@ -34,6 +32,11 @@ type Process struct { execWithPippedName string wg sync.WaitGroup + + inUse bool // 进程正在工作 + inPool bool // 创建进程时是否已加入到进程池 + closed bool // 进程已退出 + idleAt int64 // 空闲开始时间 } var ( @@ -54,6 +57,18 @@ func newProcess(execPath string, args []string, env []string) *Process { return p } +// IdleAt time of turned to idle status +func (p *Process) IdleAt() time.Time { + unix := atomic.LoadInt64(&p.idleAt) + return time.Unix(unix, 0) +} + +// TouchIdleTime set idle time as now +func (p *Process) TouchIdleTime() { + atomic.StoreInt64(&p.idleAt, time.Now().Unix()) + p.inUse = false +} + // TryStart will execute php-cgi twince func (p *Process) TryStart() (err error) { // pippedName 是啟動 php-cgi 時候指定 -b pipename 使用的 diff --git a/server/sever.go b/server/sever.go index 52b1138..8156c2b 100644 --- a/server/sever.go +++ b/server/sever.go @@ -2,6 +2,7 @@ package server import ( "net" + "wphpfpm/phpfpm" log "github.com/sirupsen/logrus" "golang.org/x/net/netutil" @@ -19,6 +20,8 @@ type Server struct { shutdownChan chan bool // 此值如果為 true , 代表 Server 必須停止,所有工作都需要關閉 shutdown bool + + PhpfpmPool *phpfpm.Instance } // Conn 是當 Accept 後產生的連線物件 From fe6dc1fc9a30ef63472dfcbba9debe459fe32f87 Mon Sep 17 00:00:00 2001 From: hdk Date: Thu, 4 Mar 2021 17:25:02 +0800 Subject: [PATCH 3/3] graceful restart php-cgi process via reload command --- go.mod | 2 +- main.go | 125 +++++++++++++++++++++++++++++++++------------- phpfpm/phpfpm.go | 25 ++++++++-- phpfpm/process.go | 8 +-- server/winsvc.go | 98 ++++++++++++++++++++++++++++++++++++ 5 files changed, 213 insertions(+), 45 deletions(-) create mode 100644 server/winsvc.go diff --git a/go.mod b/go.mod index 2169c4e..656f5ad 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/kr/pretty v0.1.0 // indirect github.com/sirupsen/logrus v1.4.2 golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2 - golang.org/x/sys v0.0.0-20190912141932-bc967efca4b8 // indirect + golang.org/x/sys v0.0.0-20190912141932-bc967efca4b8 gopkg.in/alecthomas/kingpin.v2 v2.2.6 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 diff --git a/main.go b/main.go index 141c1bc..b33c9d7 100644 --- a/main.go +++ b/main.go @@ -25,12 +25,14 @@ var ( commandInstall *kingpin.CmdClause commandUninstall *kingpin.CmdClause commandStart *kingpin.CmdClause + commandReload *kingpin.CmdClause commandStop *kingpin.CmdClause commandRun *kingpin.CmdClause flagConfigFile *string servers []*server.Server - // phpfpmInst []*phpfpm.Instance + + config *conf.Conf ) func main() { @@ -42,7 +44,12 @@ func main() { checkConfigFileExist(*flagConfigFile) fmt.Println(serviceName, "Run service") - if err := winsvc.RunAsService(serviceName, startService, stopService, false); err != nil { + serviceHandel := &server.WinService{ + Start: startService, + Stop: stopService, + Reload: reloadService, + } + if err := server.RunAsService(serviceName, serviceHandel); err != nil { log.Fatalf(serviceName+" run: %v\n", err) } } else { @@ -63,16 +70,21 @@ func main() { startService() case commandStart.FullCommand(): if err := winsvc.StartService(serviceName); err != nil { - fmt.Println("Start service:", err) + fmt.Println("Start service: ", err) os.Exit(1) } - fmt.Println("Start service: success") + fmt.Println("Start service : success") + case commandReload.FullCommand(): + if err := server.ReloadService(serviceName); err != nil { + fmt.Println("Reload service :", err) + } + fmt.Println("Reload service : success") case commandStop.FullCommand(): if err := winsvc.StopService(serviceName); err != nil { - fmt.Println("Stop service:", err) + fmt.Println("Stop service :", err) os.Exit(1) } - fmt.Println("Stop service: success") + fmt.Println("Stop service : success") return } } @@ -84,6 +96,7 @@ func initCommandFlag() { commandUninstall = kingpin.Command("uninstall", "Uninstall service") commandStart = kingpin.Command("start", "Start service.") commandStop = kingpin.Command("stop", "Stop service.") + commandReload = kingpin.Command("reload", "reload config and graceful restart php-cgi processes.") commandRun = kingpin.Command("run", "Run in console mode") flag := kingpin.Flag("conf", "Config file path , required by install or run.") if len(os.Args) > 1 && (os.Args[1] == "install" || os.Args[1] == "run") { @@ -122,15 +135,9 @@ func installService() { // 啟動服務 func startService() { - config, err := conf.LoadFile(*flagConfigFile) - - if err != nil { - fmt.Printf("Config load error : %s\n", err.Error()) - os.Exit(1) - } + var err error - fmt.Printf("Start in console mode , press CTRL+C to exit ...\r\n") - initLogger(config) + loadConfig() var events server.Event @@ -210,12 +217,45 @@ func startService() { log.Info("Service Stopped.") } +func reloadService() { + var err error + + loadConfig() + + for i := 0; i < len(servers); i++ { + + oldFpm := servers[i].PhpfpmPool + + // create and replace instance + if len(config.Instances)-1 >= i { + instance := config.Instances[i] + phpfpmInst := phpfpm.NewPhpFpmInstance(i, instance) + if err != nil { + log.Fatalf("Can not restart service : %s\n", err.Error()) + continue + } + + err = phpfpmInst.Start() + if err != nil { + log.Fatalf("Can not restart service : %s\n", err.Error()) + continue + } + + servers[i].PhpfpmPool = phpfpmInst + } + + // stop old instance + oldFpm.Stop() + } + +} + // 停止服務 func stopService() { for i := 0; i < len(servers); i++ { - servers[i].Shutdown() servers[i].PhpfpmPool.Stop() + servers[i].Shutdown() } } @@ -228,6 +268,41 @@ func checkConfigFileExist(filepath string) { } } +func loadConfig() { + + var err error + config, err = conf.LoadFile(*flagConfigFile) + + if err != nil { + fmt.Printf("Config load error : %s\n", err.Error()) + os.Exit(1) + } + + fmt.Printf("Start in console mode , press CTRL+C to exit ...\r\n") + initLogger(config) + + // Repair config + for i := 0; i < len(config.Instances); i++ { + if config.Instances[i].MaxRequestsPerProcess < 1 { + // Repair MaxRequestsPerProcess + log.Warnf("Instance #%d MaxRequestsPerProcess is less 1 , set to 500", i) + config.Instances[i].MaxRequestsPerProcess = 500 + } + + if config.Instances[i].MaxProcesses < 1 { + //Repair MaxProcesses + log.Warnf("Instance #%d MaxProcesses is less 1 , set to 4", i) + config.Instances[i].MaxProcesses = 4 + } + + if config.Instances[i].IdleTimeout < 5 { + //Repair MaxProcesses + log.Warnf("Instance #%d IdleTimeout is less than 5s , set to 120s", i) + config.Instances[i].IdleTimeout = 120 + } + } +} + func initLogger(config *conf.Conf) { formatter := &MyTextFormatter{timeFormat: "2006-01-02 15:04:05 -0700"} @@ -271,26 +346,6 @@ func initLogger(config *conf.Conf) { log.SetLevel(logLevel) log.Infof("Set LogLevel to %s.", strings.ToUpper(logLevel.String())) - // Repair config - for i := 0; i < len(config.Instances); i++ { - if config.Instances[i].MaxRequestsPerProcess < 1 { - // Repair MaxRequestsPerProcess - log.Warnf("Instance #%d MaxRequestsPerProcess is less 1 , set to 500", i) - config.Instances[i].MaxRequestsPerProcess = 500 - } - - if config.Instances[i].MaxProcesses < 1 { - //Repair MaxProcesses - log.Warnf("Instance #%d MaxProcesses is less 1 , set to 4", i) - config.Instances[i].MaxProcesses = 4 - } - - if config.Instances[i].IdleTimeout < 5 { - //Repair MaxProcesses - log.Warnf("Instance #%d IdleTimeout is less than 5s , set to 120s", i) - config.Instances[i].IdleTimeout = 120 - } - } } // MyTextFormatter logrus custom formatter diff --git a/phpfpm/phpfpm.go b/phpfpm/phpfpm.go index 64d0bf6..6a6ec7b 100644 --- a/phpfpm/phpfpm.go +++ b/phpfpm/phpfpm.go @@ -55,6 +55,9 @@ func (inst *Instance) Start() (err error) { } func (inst *Instance) createAndPushProcess() (err error) { + if inst.stopManage { + return + } p1 := newProcess(inst.conf.ExecPath, inst.conf.Args, inst.conf.Env) @@ -107,12 +110,24 @@ func (inst *Instance) monProcess(p *Process) { func (inst *Instance) Stop() { log.Info("phpfpm stoping.") inst.stopManage = true - inst.mutex.Lock() - defer inst.mutex.Unlock() - for _, p := range inst.processes { - p.Kill() + for { + p := inst.popupIdle() + if p != nil { + inst.remove(p) + p.Kill() + } + + inst.mutex.Lock() + length := len(inst.processes) + inst.mutex.Unlock() + + if length == 0 { + break + } + time.Sleep(time.Duration(500 * time.Microsecond)) } + log.Info("phpfpm stopped.") } @@ -262,7 +277,7 @@ func (inst *Instance) remove(p *Process) { inst.mutex.Lock() defer inst.mutex.Unlock() - if p == inst.idleProcesses[0] { + if len(inst.idleProcesses) > 0 && p == inst.idleProcesses[0] { inst.idleProcesses = inst.idleProcesses[1:] } diff --git a/phpfpm/process.go b/phpfpm/process.go index 25c7015..9c3d946 100644 --- a/phpfpm/process.go +++ b/phpfpm/process.go @@ -33,10 +33,10 @@ type Process struct { wg sync.WaitGroup - inUse bool // 进程正在工作 - inPool bool // 创建进程时是否已加入到进程池 - closed bool // 进程已退出 - idleAt int64 // 空闲开始时间 + inUse bool // 进程正在工作 + inPool bool // 创建进程时是否已加入到进程池 + closed bool // 进程已退出 + idleAt int64 // 空闲开始时间 } var ( diff --git a/server/winsvc.go b/server/winsvc.go new file mode 100644 index 0000000..12bf2a2 --- /dev/null +++ b/server/winsvc.go @@ -0,0 +1,98 @@ +package server + +import ( + "fmt" + "time" + + log "github.com/sirupsen/logrus" + "golang.org/x/sys/windows/svc" + "golang.org/x/sys/windows/svc/mgr" +) + +const ( + ReloadCmd = svc.Cmd(129) // 128-255 user-defined control code + RestartCmd = svc.Cmd(130) +) + +// ReloadService send user defined signal to service +func ReloadService(name string) error { + m, err := mgr.Connect() + if err != nil { + return err + } + defer m.Disconnect() + s, err := m.OpenService(name) + if err != nil { + return fmt.Errorf("svc.controlService: could not access service: %v", err) + } + defer s.Close() + + _, err = s.Control(ReloadCmd) + if err != nil { + return fmt.Errorf("svc.controlService: could not send control=ReloadCmd: %v", err) + } + return nil +} + +// RunAsService start service +func RunAsService(name string, service svc.Handler) (err error) { + + log.Infof("svc.RunAsService: starting %s service", name) + if err = svc.Run(name, service); err != nil { + log.Errorf("%s service failed: %v", name, err) + return + } + log.Infof("svc.RunAsService: %s service stopped", name) + return +} + +// WinService service handler +type WinService struct { + Start func() + Stop func() + Reload func() + Reopen func() +} + +// Execute service executer +func (p *WinService) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) { + log.Info("svc.Execute:" + "begin") + const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue + changes <- svc.Status{State: svc.StartPending} + changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} + + go p.Start() + +loop: + for { + select { + case c := <-r: + switch c.Cmd { + case svc.Interrogate: + changes <- c.CurrentStatus + // testing deadlock from https://code.google.com/p/winsvc/issues/detail?id=4 + time.Sleep(100 * time.Millisecond) + changes <- c.CurrentStatus + case svc.Stop, svc.Shutdown: + break loop + case svc.Pause: + changes <- svc.Status{State: svc.Paused, Accepts: cmdsAccepted} + case svc.Continue: + changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} + case ReloadCmd, RestartCmd: + if p.Reload != nil { + p.Reload() + log.Errorf("svc.Execute:: Reload()") + } + changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} + default: + log.Errorf("svc.Execute:: unexpected control request #%d", c) + } + } + } + changes <- svc.Status{State: svc.StopPending} + p.Stop() + + log.Info("svc.Execute:" + "end") + return +}