انتقال فایل بین 2 هاست بدون دانلود و آپلود + با استفاده از PHP

آیا میخواهید فایلهای حجیم را سریع به هاست جدید منتقل کنید؟
انتقال فایل بین دو هاست زمانی که حجم فایل بالا باشد (مثلاً بستههای نصبی داپلیکیتور)، میتواند بسیار زمانبر و هزینهبر باشد. در چنین شرایطی، دانلود فایل روی سیستم شخصی و آپلود مجدد آن اصلاً راهکار منطقی و مناسبی نیست. در این آموزش تخصصی از وبینیو، روشهای انتقال فایل مستقیم (سرور به سرور) را بررسی میکنیم. حتی ترفندی را به شما آموزش میدهیم که بدون متصل بودن دامنه به هاست جدید، عملیات انتقال را در کمتر از چند دقیقه انجام دهید!
۱. انتقال فایل بین دو هاست با استفاده از کد PHP
در این روش از تابع copy() در زبان PHP استفاده میشود. دقت داشته باشید که برای اجرای این کد، نسخه PHP هاست باید بالاتر از 5 باشد و برای دسترسی راحت به فایل، دامنه شما باید به هاست جدید متصل باشد.
مرحله اول: ایجاد فایل در هاست جدید
- وارد هاست جدید شوید و در پوشهای که قصد دارید فایل در آن ذخیره شود (معمولاً
public_html)، یک فایل PHP جدید ایجاد کنید. - نام فایل را
copy.phpبگذارید تا مشخص باشد که این فایل مسئول انتقال است. - روی فایل
copy.phpراستکلیک کرده و گزینه Edit را انتخاب نمایید. - کد زیر را کپی کرده و درون آن قرار دهید:
<?php
// برای جلوگیری از قطع شدن عملیات در فایلهای حجیم
set_time_limit(0);
// پارامتر اول مسیر فایل مبدا و پارامتر دوم نام فایل جدید است
if(copy('https://www.old-site.com/file.zip', 'new-file.zip')) {
echo "انتقال با موفقیت انجام شد!";
} else {
echo "خطا در انتقال!";
}
?>
روش جایگزین برای خطاهای SSL و انتقال فایل با cURL
در بیشتر مواقع، روش ساده copy() برای انتقال فایل بین دو هاست کافی است. بااینحال، گاهی ممکن است بهدلیل فعال نبودن SSL، منقضی یا نامعتبر بودن گواهی SSL یا مطابقت نداشتن گواهی با نام دامنه، انتقال فایل با خطا مواجه شود.
برای مثال، خطای زیر نشان میدهد که گواهی SSL با آدرس دامنه مطابقت ندارد:
cURL error 60: SSL certificate problem
در چنین شرایطی میتوانید کد قبلی را با نسخه زیر جایگزین کنید. این روش از cURL استفاده میکند و علاوه بر نمایش جزئیات خطا، امکان انتقال فایل از سرورهایی با گواهی SSL نامعتبر را نیز فراهم میکند.
نکته: اگر سایت مبدا اصلاً SSL ندارد، آدرس فایل را با
http://وارد کنید. غیرفعال کردن بررسی SSL فقط زمانی کاربرد دارد که آدرس باhttps://باز میشود، اما گواهی SSL آن نامعتبر، منقضی یا ناسازگار با نام دامنه است.
<?php
// جلوگیری از قطع شدن عملیات هنگام انتقال فایلهای حجیم
set_time_limit(0);
// نمایش تمام خطاهای PHP
error_reporting(E_ALL);
ini_set('display_errors', '1');
// آدرس مستقیم فایل در هاست مبدا
$source = 'https://www.old-site.com/file.zip';
// نام و مسیر ذخیره فایل در هاست جدید
$destination = __DIR__ . '/new-file.zip';
// بررسی فعال بودن افزونه cURL
if (!function_exists('curl_init')) {
exit('افزونه cURL روی هاست فعال نیست.');
}
// بررسی مجوز نوشتن در پوشه مقصد
if (!is_writable(__DIR__)) {
exit(
'پوشه مقصد مجوز نوشتن ندارد: ' .
htmlspecialchars(__DIR__, ENT_QUOTES, 'UTF-8')
);
}
// ایجاد فایل در هاست مقصد
$file = fopen($destination, 'wb');
if ($file === false) {
$error = error_get_last();
exit(
'امکان ساخت فایل مقصد وجود ندارد: ' .
htmlspecialchars(
$error['message'] ?? 'خطای نامشخص',
ENT_QUOTES,
'UTF-8'
)
);
}
// ایجاد درخواست cURL
$curl = curl_init($source);
curl_setopt_array($curl, [
CURLOPT_FILE => $file,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 10,
CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_TIMEOUT => 0,
// غیرفعال کردن بررسی SSL برای گواهیهای نامعتبر
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_USERAGENT => 'Mozilla/5.0 File Transfer Script',
]);
// اجرای عملیات انتقال
$result = curl_exec($curl);
// دریافت اطلاعات خطا و پاسخ سرور
$curlError = curl_error($curl);
$curlNumber = curl_errno($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
// بستن اتصال و فایل
curl_close($curl);
fclose($file);
// بررسی نتیجه انتقال
if ($result === false || $httpCode < 200 || $httpCode >= 300) {
// حذف فایل ناقص در صورت ناموفق بودن انتقال
if (file_exists($destination)) {
unlink($destination);
}
echo 'انتقال فایل ناموفق بود.<br>';
echo 'کد HTTP: ' . (int) $httpCode . '<br>';
echo 'شماره خطای cURL: ' . (int) $curlNumber . '<br>';
echo 'پیام خطا: ' . htmlspecialchars(
$curlError ?: 'پاسخ نامعتبر از سرور مبدا',
ENT_QUOTES,
'UTF-8'
);
} else {
echo 'انتقال فایل با موفقیت انجام شد.<br>';
echo 'حجم فایل: ' .
number_format(filesize($destination)) .
' بایت';
}
?>
در کد بالا باید مقادیر زیر را متناسب با فایل خود تغییر دهید:
- مقدار
$sourceرا با آدرس مستقیم فایل در هاست مبدا جایگزین کنید. - در مقدار
$destinationبهجایnew-file.zipنام موردنظر برای فایل جدید را وارد کنید. - اگر هاست مبدا SSL ندارد، آدرس فایل را با
http://بنویسید. - اگر فایل در مسیر دیگری قرار دارد، آدرس کامل و مستقیم آن را وارد کنید.
مزایای روش cURL نسبت به روش ساده copy()
- امکان انتقال فایل از سایتهایی با SSL نامعتبر، منقضی یا ناسازگار با دامنه
- پشتیبانی از آدرسهایی که به صفحه یا دامنه دیگری ریدایرکت میشوند
- عملکرد مناسبتر هنگام انتقال فایلهای حجیم
- نمایش شماره و پیام دقیق خطای cURL
- نمایش کد HTTP سرور مبدا، مانند خطاهای 403، 404 و 500
- بررسی فعال بودن افزونه cURL روی هاست
- بررسی مجوز نوشتن در پوشه مقصد
- حذف خودکار فایل ناقص در صورت ناموفق بودن انتقال
- نمایش حجم فایل پس از انتقال موفق
- ذخیره مستقیم اطلاعات در فایل مقصد و جلوگیری از اشغال بیشازحد حافظه PHP
هشدار امنیتی: غیرفعال کردن گزینههای
CURLOPT_SSL_VERIFYPEERوCURLOPT_SSL_VERIFYHOSTامنیت اتصال را کاهش میدهد. بنابراین، از این روش فقط برای انتقال موقت فایل از یک هاست مورداعتماد استفاده کنید. راهحل اصولی، نصب یا اصلاح گواهی SSL هاست مبدا است.
مهم: پس از پایان انتقال، حتماً فایل PHP انتقالدهنده را از روی هاست حذف کنید. همچنین اگر فایل منتقلشده شامل بکاپ سایت یا اطلاعات حساس است، آن را در یک مسیر عمومی و قابل دانلود نگه ندارید.
مرحله دوم: اجرای فایل
کافی است مرورگر خود را باز کنید و آدرس فایلی که ساختید را فراخوانی کنید. (مثلاً https://yourdomain.com/copy.php). مرورگر در حالت لودینگ میماند تا انتقال به پایان برسد. به هیچ وجه صفحه را نبندید تا پیام موفقیتآمیز بودن آن نمایش داده شود.
۲. انتقال مستقیم با Cron Job (راهکار زمان قطع بودن دامنه!)
گاهی اوقات شما هاست جدیدی خریدهاید اما دامنه هنوز به آن متصل نیست یا DNSها تغییر نکردهاند. همچنین در برخی هاستینگها (مثل نت افراز) دسترسی مستقیم به ترمینال (SSH) مسدود است. در این شرایط، بهترین، پایدارترین و سریعترین راهکار استفاده از ابزار کرون جاب (Cron Jobs) است.
- وارد پنل هاست خود (سی پنل یا دایرکت ادمین) شوید و به بخش Cron Jobs (کرون جابها) بروید.
- یک کرون جاب جدید ایجاد کنید و زمان اجرای آن را روی هر ۱ دقیقه (قرار دادن ستاره * در تمامی فیلدها) تنظیم کنید.
- در کادر Command (دستور)، باید از دستور
wgetاستفاده کنید. کد زیر یک نمونه استاندارد است:
/usr/bin/wget -q -O /home/username/domains/yourdomain.com/public_html/backup.zip https://old-site.com/backup.zip
راهنمای کد بالا: به جای username نام کاربری ورود به هاست جدید خود، و به جای yourdomain.com نام دامنهای که به عنوان دامنه اصلی در هاست ثبت کردهاید را بنویسید. آدرس اینترنتی انتهای کد نیز لینک دانلود فایل در سرور قدیم شما است.
پس از ذخیره کردن این دستور در کرون جاب، فقط ۱ دقیقه صبر کنید تا فرآیند دانلود شروع شود. سپس بلافاصله آن کرون جاب را از لیست حذف کنید! نگران نباشید، دانلود قطع نمیشود، بلکه حذف کردن آن باعث میشود سرور در دقیقه بعدی مجدداً فایل را از صفر دانلود نکند و باعث خرابی فایل زیپ شما نشود. پس از چند دقیقه به File Manager بروید، خواهید دید فایل دانلود شده است.
۳. ترفند طلایی برای حرفهایها: گول زدن سیستم با فایل Hosts
اگر طراح سایت، برنامهنویس یا سئوکار هستید، یک ترفند فوقالعاده برای زمانی که میخواهید بستههای نصبی (مثل Duplicator) را پیش از ست شدن DNSها روی سرور جدید نصب کنید وجود دارد. شما میتوانید به ویندوز خود دستور دهید که دامنه را موقتاً از روی IP هاست جدید بخواند:
- نرمافزار Notepad را در ویندوز به صورت Run as administrator باز کنید.
- از طریق منوی File و Open، فایل
hostsرا در مسیرC:\Windows\System32\drivers\etcباز کنید. - در خط آخر، IP هاست جدید (مثبت ۸۹.۴۲.۴۴.۹۴) و سپس با یک فاصله نام دامنه سایتتان را بنویسید و فایل را ذخیره کنید. (مثال:
89.42.44.94 yourdomain.ir)
کار تمام است! حالا اگر آدرس سایت یا فایلهای نصب (مثل installer.php) را در مرورگر تایپ کنید، مستقیماً از هاست جدید باز میشوند و میتوانید سایت خود را نصب کنید. فراموش نکنید پس از اتمام کار، این خط را از فایل پاک کنید تا سیستم به حالت عادی برگردد.
جمعبندی نهایی
با استفاده از این سه روش حرفهای، میتوانید فایلهای حجیم و گیگابایتی را بین دو هاست بدون نیاز به دانلود روی سیستم خود جابهجا کنید. این کار نه تنها زمان انتقال را به چند ثانیه یا دقیقه کاهش میدهد، بلکه هزینههای ترافیک اینترنت شما را نیز به صفر میرساند.
در صورتی که در اجرای مراحل بالا در دایرکت ادمین یا سی پنل با مشکلی مواجه شدید، میتوانید از طریق چت آنلاین سایت وبینیو یا دایرکت اینستاگرام، سوالات خود را بپرسید تا سریعاً راهنمایی دریافت کنید.






