PDA

View Full Version : حرفه ای: ارسال ایمیل در یک تاریخ خاص با php



ghiravani
جمعه 27 آبان 1390, 00:45 صبح
سلام دوستان خسته نباشید

دارم برنامه ای مینویسم تا به سایت چند زمان بدم و سایت سر اون زمان ها ایمیل هایی رو ارسال کنه.
یه راه برای این کار استفاده از قابلیت corn jobs سی پنل هست.اما این کار خیلی مشکلی هست.
مثلا باید corn jobs رو طوری تنظیم کرد تا هر 10 دقیقه به یه صفحه (صفحه پرداز مورد نظر ما) بره و مدام چک کنه موعد تاریخ های مورد نظر فرا رسیده یا نه.خب اینطوری یکم سرور هم مشغول هست و کار زیاد جالبی هم نیست

راه دیگه ای وجود نداره که ما در دیتابیس تاریخ یا زمان برای آینده بدیم (مثلا 15 روز دیگه ساعت 13:45 دقیقه) و بدون استفاده از corn jobs عملیات مورد نظر انجام بشه؟؟؟؟


ممنون

aghasoroush
جمعه 27 آبان 1390, 01:46 صبح
با سلام خدمت شما دوست عزیزم
برای این کار میشه از قالب روز ماه سال استفاده کرد اما من بهتون توصیه میکنم این کارو نکنید
شما با استفاده از دستورdate('U') زمان رو بر حسب ثانیه بدست میاری بعد مثلا میخای یک ساعت بعد ایمیل ارسال بشه
خب پس قاعدتا این زمانی که به دست اوردی باید با عدد ۳۶۰۰ ثانیه جمع بشه
پس مرور میکنیم
شما تایم النو با اون کد که گفتم بدست میاری
زمانی هم که قراره ایمل ارسال بشه رو بدست میاری
بعد یه شرط میذاری که اگه زمان الان برابر بود با اون زمان دلخواهی که توی بانک اطلاعاتیه ایمیل بفرست


set_time_limit(0);// code ro hamishe ejra negah midare
$now = date('U');
$time_of_send = $now + 15*24*60*60; // 15 ruze ayande
unset ($now);
if (date('U') == $time_of_send)
Ersale email...

شما میتونید این کد رو بهینه کنید و از بانک اطلاعاتی استفاده کنید
من این مثال رو زدم که اصل موضوع رو متوجه بشین
سوالی بود در خدمتم

ghiravani
جمعه 27 آبان 1390, 10:48 صبح
با سلام خدمت شما دوست عزیزم
برای این کار میشه از قالب روز ماه سال استفاده کرد اما من بهتون توصیه میکنم این کارو نکنید
شما با استفاده از دستورdate('U') زمان رو بر حسب ثانیه بدست میاری بعد مثلا میخای یک ساعت بعد ایمیل ارسال بشه
خب پس قاعدتا این زمانی که به دست اوردی باید با عدد ۳۶۰۰ ثانیه جمع بشه
پس مرور میکنیم
شما تایم النو با اون کد که گفتم بدست میاری
زمانی هم که قراره ایمل ارسال بشه رو بدست میاری
بعد یه شرط میذاری که اگه زمان الان برابر بود با اون زمان دلخواهی که توی بانک اطلاعاتیه ایمیل بفرست


set_time_limit(0);// code ro hamishe ejra negah midare
$now = date('U');
$time_of_send = $now + 15*24*60*60; // 15 ruze ayande
unset ($now);
if (date('U') == $time_of_send)
Ersale email...

شما میتونید این کد رو بهینه کنید و از بانک اطلاعاتی استفاده کنید
من این مثال رو زدم که اصل موضوع رو متوجه بشین
سوالی بود در خدمتم

سلام دوست عزیز.ممنونم از توجه شما

اما منظورم اینه که این ارسال خودکار در زمان مقرر انجام بشه و وابسته به عملیات از سمت کاربر نباشه.
یعنی ابتدا شما به سایت میگید "28/8/1390 - 16:40" ایمیلی با متن "سلام.خسته نباشید" به آدرس x ارسال کن.
این دستور در یه table داخل دیتابیس ذخیره میشه.اما فرضا الان اون زمان مقرر هست.سرور از کجا تشخیص بده این زمان فرا رسیده تا عملیات ذخیره شده رو اجرا کنه؟
میشه از corn jobs استفاده کرد.اما این روش خیلی کار از سرور میکشه و مناسب برای هر کاری نیست.

روشی که شما فرمودید ، فکر کنم وابسته به اینه که مثلا هر بازدید کننده که وارد سایت میشه ، time ورود این بازدید کننده با تایم های ذخیره شده در دیتابیس مقایسه میشه.اگر تایم ها یکی بودن عملیات انجام میشه.اما بازدید سایت اونقدر بالا نیست که بشه عملیات رو وابسته به ورود کاربران کرد.

بازم که منظورم رو متوجه نشدید ، بفرمایید تا بیشتر توضیح بدم.

ممنون :)

aghasoroush
جمعه 27 آبان 1390, 11:23 صبح
با سلام مجدد
ببینید دوست من، شما خودت اون کد رو اجرا میکنی و به کاربر ربطی نداره
وقتی یه بار اجراش کنی تا زمانی که سرور ریست نشه اون فایل پی اچ پی اجرا میمونه
البته کد من اشکال داشت چون اگه به هر دلیل کد دوباره اجرا بشه زمان مورد نظر تغییر میکنه
این کدی که دادم بهتون تقریبا کار کران جاب رو انجام میده و تایم اوت نمیشه
شما تمام کاری که باید بکنی اینه که یه کد پی اچ پی بنویسی که دائم اجرا باشه و چک کنه هر ۱۰ ثانیه که آیا زمان الان برابر هست با زمان مورد نظر یا خیر
اگه شرط درست بود ارسال رو انجام بده
من براتون کدش رو طی چند ساعت آینده میذارم الان با گوشیم کد نویسیم یه ذره سخته
موفق باشید

ghiravani
جمعه 27 آبان 1390, 11:51 صبح
این کدی که دادم بهتون تقریبا کار کران جاب رو انجام میده و تایم اوت نمیشه
شما تمام کاری که باید بکنی اینه که یه کد پی اچ پی بنویسی که دائم اجرا باشه و چک کنه هر ۱۰ ثانیه که آیا زمان الان برابر هست با زمان مورد نظر یا خیر


سلام.ممنون بخاطر توجه تون
اما مشکلی که الان هست اینه که شاید از این عملیات ها 100 تا وجود داشته باشه در قسمت های مختلف ساید.بعد 100 تا صفحه مدام بخواد اجرا بشه برای چک کردن ، خیلی کار از سرور میکشه

ممنون

aghasoroush
جمعه 27 آبان 1390, 12:20 عصر
دوست من اصلا کار قابل توجهی نمیکشه
باید خوب روی تعریف متغیرات دقت کنی تا منابع بی خودی اشغال نشن
من چند ساعت دیگه که کد کامل رو برات گذاشتم چند تا مورد رو هم برات مثال میزنم
موفق باشی

aghasoroush
شنبه 28 آبان 1390, 01:11 صبح
با سلام خدمت شما دوست خوبم
من این کد رو به صورت نمونه میدم بهتون
شما بهینش کنید و استفاده کنید

<?php
/**
* @author Soroush
* @copyright 2011
*/
set_time_limit(0);
/*
inja dastoorate database ro minevisid ke zamane morede nazar ro az database bekhoone
masalan zamane morede nazar ro mirizim tooye motaghayere $time
*/
$time = 1322947930; // masalan in meghdar tooye database zakhire shode ama man khodam dasti daram meghdar midam
function check($mail,$subject,$msg)
{
if (date('U') >= $time)
{
mail($mail,$subject,$msg);
}
}
while($i=0) //in ye halgheye bi nahayate ke baraye hamishe edame dare
{
check("aghasoroush@gmail.com","salam","Lotfan hesabe karbarie khod ra check konid");
sleep(60); // in baes mishe ke kamtar be server feshar biad va har daghighe faghat 1 bar code ejra beshe
}
?>

من این کد رو اجرا کردم و حتی 1 درصد cpu هم نگرفت
موفق باشید

Arthas1990
شنبه 28 آبان 1390, 01:50 صبح
آقا سروش ممنون ازینکه به سوال دوسته گلمون جواب دادی .
و اما ghiravani (http://barnamenevis.org/member.php?u=114933) گل :
بهترین راهش ساختن کرون جبه با php . باید یه کرون جاب بسازی (البته نه با cpanel و غیره) با خوده سرورت و سپس به کرونت تاریخ بدی تا برنامت رو اجرا کنه ، بنابراین میتونی خیلی راحت هر زمان و هرتعداد که میخوای در ساعتی خاص و برنامه های مختلف رو اجرا کنی . توضیحاته بیشتر رو بهم بزنگ یا pm بده به یاهوم تا بت بگم و بعدش وا3 اینکه دیگر دوستانم استفاده کنن بیار تو برنامه نویس خودت توضیح بده و اگه جواب داد تشکر یادت نره :چشمک:
امیدوارم کمکی کرده باشم

رضا قربانی
یک شنبه 29 آبان 1390, 01:08 صبح
با سلام خدمت شما دوست خوبم
من این کد رو به صورت نمونه میدم بهتون
شما بهینش کنید و استفاده کنید

<?php
/**
* @author Soroush
* @copyright 2011
*/
set_time_limit(0);
/*
inja dastoorate database ro minevisid ke zamane morede nazar ro az database bekhoone
masalan zamane morede nazar ro mirizim tooye motaghayere $time
*/
$time = 1322947930; // masalan in meghdar tooye database zakhire shode ama man khodam dasti daram meghdar midam
function check($mail,$subject,$msg)
{
if (date('U') >= $time)
{
mail($mail,$subject,$msg);
}
}
while($i=0) //in ye halgheye bi nahayate ke baraye hamishe edame dare
{
check(&quot;aghasoroush@gmail.com&quot;,&quot;salam&quot;,&quot;Lotfan hesabe karbarie khod ra check konid&quot;);
sleep(60); // in baes mishe ke kamtar be server feshar biad va har daghighe faghat 1 bar code ejra beshe
}
?>

من این کد رو اجرا کردم و حتی 1 درصد cpu هم نگرفت
موفق باشید

ممنون دوست من از توجهت . این کدهایی که از اول نوشته اید زمانی اجرا می شه که یک کاربر حضور داشته باشه و صفحه یکبار لود بشه در غیر این صورت اجرا نمی شه !!! یا اگر کامپیوتر خاموش باشد ؟ دوستی که سوال پرسیدند خواستند به صورت آفلاین این کار انجام بشه ، یعنی اگر کاربری هم وارد سایت نبود این ایمیل در ساعت خواص ارسال بشه. که برای این کار کلاس پی اچ پی مایلر این کار رو برای این دوستمون فراهم می کنه . کافیه یک سرچ چند ثانیه ای در مورد این کلاس بزنید . موفق باشید

aghasoroush
یک شنبه 29 آبان 1390, 02:16 صبح
ممنون دوست من از توجهت . این کدهایی که از اول نوشته اید زمانی اجرا می شه که یک کاربر حضور داشته باشه و صفحه یکبار لود بشه در غیر این صورت اجرا نمی شه !!! دوستی که سوال پرسیدند خواستند به صورت آفلاین این کار انجام بشه ، یعنی اگر کاربری هم وارد سایت نبود این ایمیل در ساعت خواص ارسال بشه. که برای این کار کلاس پی اچ پی مایلر این کار رو برای این دوستمون فراهم می کنه . کافیه یک سرچ چند ثانیه ای در مورد این کلاس بزنید . موفق باشید

دوست من مرسی که در حد برداشت خودت از کد میای و نظر میدی ایشالا با یکم تلاش و دادن این جور پستا قوی تر میشی. ایشون خودشون وقتی اینو باز کنن دیگه باز میمونه. نمیدونم بعد از ۸۰۰ تا پست که دادین این پست الان دیگه چیه.
موفق باشین.

رضا قربانی
یک شنبه 29 آبان 1390, 10:13 صبح
ما داریم با زبون خوش و با ملایمت صحبت و راهنمایی می کنیم . نمی دونم چرا چند روزیه که همه با ما دعوا دارن
تو به همون 800 تا پست کن و باهاش خوش باش .

این اصلا بهینه نیست دوست من :

یا با cron job می شه یا با کلاس

این واسه کرون جاب و ارسال ایمیل: http://www.daniweb.com/web-development/php/threads/123389
اینم سایت رسمی phpmailer که می تونید تمام ورژن ها رو دانلود کنید همراه با آموزش :http://phpmailer.worxware.com/

و در آخر به قول دوستمون که گفته بودن :


بخاطر همینه وقتی یه برنامه تحت ویندوز ایرانی نوشته می شه با رم 1 گیگ هم به سختی بالا میاد ، هنگ می کنه. اما ماله خارجی ها خوب کار می کنه... من می گم خوبه کار کنید که شیوه های نوین برنامه نویسی وارد ایران بشه.. شما هم از اون دسته هایید . یه کم خودت رو بکش بالا. وقتی شما می تونی غذا رو درست بخوری چرا به کسی که درخواست کمک کرده می چرخونی و غذا می دی ،مثل اینه که دستورات sql می تونی با 10 با سلکت زدن و 10 خط کد کارت رو انجام بدی ولی بهینه نیست و جریان با یک سری دستور و 2 خط یه چیز بهینه و کارآمد می نویسی و استاندارد .

و من فقط دارم کمک می کنم ، قبل اینکه هم پست بزنم ازتون بابت پیگیری تاپیک و جواب دادن تشکر کردم و اصلا قصد توهین به کسی رو ندارم .

موفق باشید دوست من

aghasoroush
یک شنبه 29 آبان 1390, 18:19 عصر
دوست من آقای قربانی اگه شما اینجا دارین پست مینویسین براشون من تلفنی با ایشون صحبت کردم و متناسب با معماری کد اینو بهشون گفتم
بعد از این همه وقت من میدونم کران جاب چیه دوست من. منتها من نخواستم ایشون رودرگیر کنم و خواستم کارشون راه بیفته تازه کلی هم بهشون ایده دادم . من ۷۰ خط کد نوشتم و کلاسم رتبه ی اول شد شما تو سایت پی اچ پی کلاسز بگرد هست پس من بهینه سازی کد رو بلدم. چرا ندونسته قضاوت میکنین که من دارم لقمه رو ... ؟ اشکالی نداره این بحث دیکه تموم شد.