socket_bind() failed: reason: Address already in useปํญหาที่พบเจอก็คือข้อผิดพลาด "Address already in use" วิธีแก้ของผู้เขียนก็คือรอเวลาระหว่างการรีสตาร์ทเซอร์วิสให้นานขึ้น แต่การรอเพื่อจะสตาร์ทเซอร์วิสใหม่นานถึง 5-10 นาที ข้อมูลที่ต้องการติดต่อระหว่างนั้นก็จะหายไปหรือปิดเซอร์วิสการให้บริการชั่วคราว นับเป็นปัญหาหนึ่งของการให้บริการ
ผู้เขียนเคยใช้งานโปรแกรมควบคุมเซอร์วิสให้ทำงานอยู่ตลอดเวลา ไม่ต้องเสียน้ำตากับการรันโปรแกรมสคริป php อัตโนมัติ supervisor แบบมืออาชีพ ซึ่งเซอร์วิสนี้พบว่าทำงานได้อย่างดีเยี่ยมโดยเฉพาะการควบคุมคิวการทำงาน(beanstalk)ใช้งานโปรแกรมจัดการคิวแบบง่าย ประสิทธิภาพสูง beanstalk
ครั้งนี้จะนำมาประยุกต์ให้ใช้ทำงานร่วมกันให้ได้อย่างมีประสิทธิภาพ สำหรับรันโปรแกรมสคริป php อัตโนมัติ สำหรับบริการเซิร์ฟเวอร์ TCP ฉบับเซียน
ขั้นตอนที่ 1 หากยังไม่เคยใช้งานโปรแกรม supervisor แนะนำให้กลับไปอ่านบทความ ไม่ต้องเสียน้ำตากับการรันโปรแกรมสคริป php อัตโนมัติ supervisor แบบมืออาชีพ ก่อน สำหรับขั้นตอนนี้ให้เพิ่มคอนฟิกไฟล์ตามตัวอย่าง
[program:ywt6035v2] command=bash -c "ulimit 10000; exec /usr/bin/php /var/www/ywt7035v2/ywt7035v2.php" ; the program (relative uses PATH, can take args) process_name=%(program_name)s ; process_name expr (default %(program_name)s) numprocs=1 ; number of processes copies to start (def 1) directory=/tmp ; directory to cwd to before exec (def no cwd) umask=022 ; umask for process (default None) priority=999 ; the relative start priority (default 999) autostart=true ; start at supervisord start (default: true) startsecs=1 ; # of secs prog must stay up to be running (def. 1) startretries=3 ; max # of serial start failures when starting (default 3) ;autorestart=unexpected ; when to restart if exited after running (def: unexpected) autorestart=true ; when to restart if exited after running (def: unexpected) exitcodes=0,2 ; 'expected' exit codes used with autorestart (default 0,2) stopsignal=QUIT ; signal used to kill process (default TERM) stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) ;stopasgroup=false ; send stop signal to the UNIX process group (default false) ;killasgroup=false ; SIGKILL the UNIX process group (def false) ;user=chrism ; setuid to this UNIX account to run the program ;redirect_stderr=true ; redirect proc stderr to stdout (default false) ;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO ;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) ;stdout_logfile_backups=10 ; # of stdout logfile backups (default 10) ;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) ;stdout_events_enabled=false ; emit events on stdout writes (default false) ;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) stderr_logfile_backups=10 ; # of stderr logfile backups (default 10) ;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) ;stderr_events_enabled=false ; emit events on stderr writes (default false) ;environment=A="1",B="2" ; process environment additions (def no adds) ;serverurl=AUTO ; override serverurl computation (childutils)ปัญหาการรีสตาร์ทเซอร์วิสสำหรับสคริปของ php ได้ถูกแก้ไขโดยใช้แบทไฟล์(bash file) ครอบไว้อีกทีหนึ่งเพื่อป้องกันปัญหาการหยุดการทำงานของสคริป php แต่ยังค้างพอร์ตไว้อีกระยะหนึ่ง ทำให้เซอร์วิสลูกใหม่ไม่สามารถสตาร์ทได้ทันที
ขั้นตอนที่ 2 เป็นการโหลดเซอร์วิสให้ทำงานขึ้นมาใหม่ และดำเนินการตรวจสอบว่าสคริป php ของเราทำงานได้อย่างถูกต้องสมบูรณ์หรือไม่ เป็นอันสิ้นสุดขั้นตอน
/etc/init.d/supervisor reloadสำหรับการตรวจสอบเซอร์วิสว่าทำงานหรือไม่ให้ใช้คำสั่ง supervisorctl
#supervisorctl pheanstalkget STARTING ywt2035v2 STARTING ywt3035v2 STARTING ywt4035v2 STARTING ywt6035v2 STARTING ywt7035v2 STARTING supervisor>หรือคำสั่ง status
supervisor> status pheanstalkget RUNNING pid 19998, uptime 0:01:37 ywt2035v2 RUNNING pid 19467, uptime 0:41:05 ywt3035v2 RUNNING pid 19468, uptime 0:41:05 ywt4035v2 RUNNING pid 19999, uptime 0:01:22 ywt6035v2 RUNNING pid 19985, uptime 0:03:20 ywt7035v2 RUNNING pid 19925, uptime 0:03:56จากคำสั่ง status จะเห็นได้ว่าเซอร์วิส uptime นานที่สุดแค่า 41.05 นาที ส่วนเซอร์วิสอื่น ๆ ก็เพิ่งจะทำงานได้ไม่นาน หากการหยุดทำงานในแต่ละครั้งกินเวลาถึง 5-10 นาทีแบบเดิม ข้อมูลที่สูญหายไปในแต่ละวันย่อมมากเกินกว่าค่าที่จะรับได้
จากการทดลองรันโปรแกรม supervisorctl สำหรับควบคุมโปรแกรมสคริป php พบว่าต้องเพิ่มบรรทัดในส่วนการเรียกใช้งานแอดเดรสใหม่ด้วยตามสคริปที่แนบให้ ให้เพิ่มก่อนถึงบรรทัด socket_bind()
// modified to correct Address already in use if (!socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1)){ echo "socket_set_option() failed: reason: ".socket_strerror(socket_last_error())."\n"; }ดังนั้นการรันโปรแกรมสคริป php อัตโนมัติ สำหรับบริการเซิร์ฟเวอร์ TCP ฉบับเซียน จะช่วยแก้ปัญหาเรื่องนี้ได้อย่างชัดเจนและเป็นรูปธรรมที่สุด ข้อสำคัญเนื้อหาบทความดี ๆ อย่างนี้จะเกิดขึ้นไม่ได้เลยหากไม่ได้รับการสนับสนุนจากบริการเวบไซต์ thai-gpstracker.com ผู้นำ รู้ลึก รู้จริง ด้านการให้บริการระบบจีพีเอสติดตามรถยนต์ บริหารงานโดยทีมงานวิศวกร