سؤال

أحتاج إلى تشغيل استعلام MySQL محدد عند WGET، والتي تعمل في الخلفية، تنتهي من تنزيل ملف. علي سبيل المثال...

واهن http: //domain/file.zip.

ثم اركض:

تحديث table تعيين status = 'Live' أين id = '1234'

كيف لي أن تذهب عن القيام بذلك؟

هل كانت مفيدة؟

المحلول

أود أن أوصي بإطلاق الأمر WGET في Subshell حتى تتمكن من التأكد من أنه يكمل قبل تشغيل أمر MySQL الخاص بك. في باش، يتم ذلك مع قوسين.

أيضا استخدام && بحيث يعمل الأمر MySQL فقط في حالة وجود أمر WGET حالة الخروج من النجاح.

#!/bin/sh
(
  wget "http://domain/file.zip" && mysql -u user -ppassword database -e "UPDATE..."
) &

وضع كلمة المرور في النص العادي في البرنامج النصي ليس بالضرورة فكرة جيدة لأنه يمكن أن ينظر إليه في ps قائمة.

بدلا من ذلك، يمكنك الاعتماد على [client] القسم الخاص بك ~/.my.cnf ملف. يمكنك أيضا استخدام MYSQL_PWD متغيرات البيئة. أي من هذه الحلول تعني عدم وجود كلمة مرور غير مرئية في قائمة الأوامر.

نصائح أخرى

wget http://domain/file.zip && mysql -u user -ppassword database -e "UPDATE table SET status = 'live' WHERE id = '1234'"

في باش، من المحتمل أن تكون بسيطة مثل:

#!/bin/bash
wget -q http://domain.tld/file.zip || exit 0
/usr/bin/php somefile.php

مع ملف .php الذي يحتوي على استعلام MySQL الخاص بك.

يمكنك أيضا تشغيل عبارة MySQL مباشرة عبر عميل MySQL (تم نشره بالفعل)، ولكن يجب أن تكون حذرا من وجود كلمة مرور MySQL الخاصة بك في Syslog / History.

حسنا، يمكنك فقط وضعه في برنامج نصي شل.

لا أعرف أنلا عن شل لأخبرك كيف

لماذا لا تستخدم file_get_contents أو curl لتنزيل الملف من داخل PHP؟

$data = file_get_contents('http://domain/file.zip');
file_put_contents('file.zip', $data);
mysql_query("UPDATE table SET status = 'live' WHERE id = '1234'");

يمكنك البرنامج النصي في بيثون وهكذا ...

#!/usr/bin/python
import sys, MySQLdb, urllib

urllib.urlretrieve(sys.argv[1], sys.argv[2])
db = MySQLdb.connect(host="localhost", user="username", passwd="password", db="database")
cursor = db.cursor()
cursor.execute("UPDATE table SET status = 'live' WHERE id = '1234'")

هذا يأخذ عنوان URL المصدر كوسيطة الأولى واسم الملف الوجهة في الثانية. ملاحظة هذا يستخدم Pythons الخاص بك مكتبة استرجاع URL الخاص بك URLLIB، إذا كان لديك أي سبب لديك لاستخدام WGET على وجه التحديد، يمكنك استيراد وحدة "نظام التشغيل" واستخدام نظام Os.System ("سطر الأوامر").

في UNIX، يمكنك تشغيل البرنامج النصي في الخلفية عن طريق كتابة "Python ScriptName.py"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top