50٪ تخفیف روی تمام دوره‌ها!
پایان تخفیف تا:
مشاهده دوره‌ها
0

قطع شدن یک پروسس سنگین تحت وب

سلام ، من یک پروسس سنگین دارم تو فروم که اجراش قطع میشه و ناقص میمونه. پروسس بازشماری امتیازات داده شده به پست های مختلفه. حدود 2.5 میلیون رکورد هست که برای پست هایی با ID های مختلف. امتیاز هر ID شمارش میشه جمع زده میشه. قبلا به راحتی اجرا میشد اما الان قطع میشه و صفحه سفید میده. احتمالا تایم اوت میده. سرور هم دست خودمه کامل. میخواستم بپرسم مشکل از کجا میتونه باشه؟ کجا رو باید تنظیم کنم که این پروسس های سنگین اجراش قطع نشه؟ خیلی به اسکریپتش نمیتونم دست بزنم که تکه تکه اجرا بکنه.

پرسیده شده در 1394/11/22 توسط

5 پاسخ

0

وب سرور و زبان برنامه نویسی شما چی هست؟

پاسخ در 1394/11/23 توسط
0

در ابتدای کدتون کد زیر رو وارد کنین

set_time_limit(0);
پاسخ در 1394/11/23 توسط
1

این هم تاثیری نداشت. حدود 20-30 ثانیه صفحه در حال اجراست ولی یهو سفید میشه. یه همچین کدی داره :

// Recount all possible values for members and posts
function gpbpManageTools_totals()
{
	global $context, $smcFunc, $txt, $modSettings;

	// Start by setting all values to zero
	$smcFunc['db_query']('','
		UPDATE {db_prefix}messages
		SET gpbp_score = 0'
	);
	$smcFunc['db_query']('','
		UPDATE {db_prefix}members
		SET gpbp_respect = 0'
	);
	
	$members = array();
	$request = $smcFunc['db_query']('','
		SELECT SUM(lg.score) AS total, lg.id_poster
		FROM {db_prefix}log_gpbp AS lg
			LEFT JOIN {db_prefix}members AS mem ON ( lg.id_poster = mem.id_member )
		WHERE mem.id_member IS NOT NULL'. ( $modSettings['gpbp_disable_disrespect'] ? '
			AND lg.score = 1' : '' ) .'
		GROUP BY lg.id_poster'
	);
	$membercount = 0;
	while ($row = $smcFunc['db_fetch_assoc']($request))
	{
		$members[$row['total']][] = $row['id_poster'];
		$membercount++;
	}
	$smcFunc['db_free_result']($request);
	foreach ($members as $respect => $ids)
	{
		// Since they're grouped by score, use an array of members (fewer queries than doing it member by member)
		$smcFunc['db_query']('','
			UPDATE {db_prefix}members
			SET gpbp_respect = {raw:respect}
			WHERE id_member IN ({array_int:ids})',
			array(
				'respect' => (string) $respect,
				'ids' => $ids
			)
		);
	}
	unset($members);
	$messagecount = 0;
	$messages = array();
	$request = $smcFunc['db_query']('','
		SELECT SUM(lg.score) AS total, lg.id_msg
		FROM {db_prefix}log_gpbp AS lg
			LEFT JOIN {db_prefix}messages AS ms ON ( lg.id_msg = ms.id_msg )
		WHERE ms.id_msg IS NOT NULL
		GROUP BY lg.id_msg'
	);
	while ($row = $smcFunc['db_fetch_assoc']($request))
	{
		$messages[$row['total']][] = $row['id_msg'];
		$messagecount++;
	}
	$smcFunc['db_free_result']($request);
	foreach ($messages as $score => $ids)
	{
		// Since the $ids array is bound to be huge (comparing to the recount of members), better to do these queries in parts
		$array = array_chunk($ids, 10);
		foreach ($array as $chunks)
			$smcFunc['db_query']('','
				UPDATE {db_prefix}messages
				SET gpbp_score = {raw:score}
				WHERE id_msg IN ({array_int:ids})',
				array(
					'score' => (string) $score,
					'ids' => $chunks
				)
			);
	}
	unset($messages);
	if ($membercount + $messagecount != 0)
	{
		logAction('gpbp_totals');
		$context['gpbp_totals_success'] = sprintf($txt['gpbp_totals_success'], $membercount, $messagecount);
	}
}

نکته ای که هست اینه که فقط اولش رو اجرا میکنه. یعنی فقط SET gpbp_score = 0 رو اجرا میکنه. اونم ناقص البته. آیتم بعدیش رو اجرا نمیکنه چک کردم هیچ کدوم صفر نشده!

maxexecutiontime رو 300 گذاشته بودم !

پاسخ در 1394/11/25 توسط
1

سلام شاید کد صفحه ی شما در قسمت SQL دارای مشکلی باشه و به همین خاطر کد از یه خط به پایین اجرا نمیشه!

اول اینکه دستورات زیر رو در ابتدای صفحه ی خودتون وارد کنید:

ini_set('display_errors','on');
error_reporting(E_ALL);

اگه صفحه ی شما اروری نداد از خطوط بالا به پایین حرکت کنید و Echo بزارید ببینید کجا اجرا نمیشه.

میشه که یه جدول جدید بسازید با تعداد رکوردهایی کمتر (مثلا 100 رکورد یا حتی بازم کمتر) و برنامه رو اول اونجا تست کنید اگه درست کار کرد بعدش برید سراغ جدول اصلی. اول باید بررسی کنید ببینید خود کد سالمه ایا؟ بعدش اگه سالم بود مسائل سرعت رو بررسی کنید

پاسخ در 1394/11/27 توسط

پاسخ شما