{"id":3128,"date":"2025-12-07T17:39:10","date_gmt":"2025-12-07T14:39:10","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/buyuk-medya-dosyalari-icin-yukleme-stratejisi-php-nginx-apache-ve-cdn-ile-parcali-upload\/"},"modified":"2025-12-07T17:39:10","modified_gmt":"2025-12-07T14:39:10","slug":"buyuk-medya-dosyalari-icin-yukleme-stratejisi-php-nginx-apache-ve-cdn-ile-parcali-upload","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/buyuk-medya-dosyalari-icin-yukleme-stratejisi-php-nginx-apache-ve-cdn-ile-parcali-upload\/","title":{"rendered":"B\u00fcy\u00fck Medya Dosyalar\u0131 \u0130\u00e7in Y\u00fckleme Stratejisi: PHP, Nginx\/Apache ve CDN ile Par\u00e7al\u0131 Upload"},"content":{"rendered":"<div class=\"dchost-blog-content-wrapper\"><div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">\u0130&ccedil;indekiler<\/p><ul class=\"toc_list\"><li><a href=\"#Neden_Buyuk_Medya_Dosyalari_Icin_Ayri_Bir_Yukleme_Stratejisi_Gerekir\"><span class=\"toc_number toc_depth_1\">1<\/span> Neden B\u00fcy\u00fck Medya Dosyalar\u0131 \u0130\u00e7in Ayr\u0131 Bir Y\u00fckleme Stratejisi Gerekir?<\/a><\/li><li><a href=\"#PHP_Limitleri_upload_max_filesize_post_max_size_ve_max_execution_time\"><span class=\"toc_number toc_depth_1\">2<\/span> PHP Limitleri: upload_max_filesize, post_max_size ve max_execution_time<\/a><ul><li><a href=\"#Temel_PHP_upload_ayarlari\"><span class=\"toc_number toc_depth_2\">2.1<\/span> Temel PHP upload ayarlar\u0131<\/a><\/li><li><a href=\"#post_max_size_ve_upload_max_filesize_iliskisi\"><span class=\"toc_number toc_depth_2\">2.2<\/span> post_max_size ve upload_max_filesize ili\u015fkisi<\/a><\/li><li><a href=\"#max_execution_time_ve_yavas_baglantilar\"><span class=\"toc_number toc_depth_2\">2.3<\/span> max_execution_time ve yava\u015f ba\u011flant\u0131lar<\/a><\/li><\/ul><\/li><li><a href=\"#Nginx_ve_Apache_Zaman_Asimi_Ayarlari_PHPden_Once_Duvara_Toslamak\"><span class=\"toc_number toc_depth_1\">3<\/span> Nginx ve Apache Zaman A\u015f\u0131m\u0131 Ayarlar\u0131: PHP\u2019den \u00d6nce Duvara Toslamak<\/a><ul><li><a href=\"#Nginx_tarafinda_kritik_direktifler\"><span class=\"toc_number toc_depth_2\">3.1<\/span> Nginx taraf\u0131nda kritik direktifler<\/a><\/li><li><a href=\"#Apache_tarafinda_kritik_direktifler\"><span class=\"toc_number toc_depth_2\">3.2<\/span> Apache taraf\u0131nda kritik direktifler<\/a><\/li><\/ul><\/li><li><a href=\"#Klasik_Form_Upload_Yaklasiminin_Sinirlari\"><span class=\"toc_number toc_depth_1\">4<\/span> Klasik Form Upload Yakla\u015f\u0131m\u0131n\u0131n S\u0131n\u0131rlar\u0131<\/a><\/li><li><a href=\"#Parcali_Chunked_Upload_Mantigi\"><span class=\"toc_number toc_depth_1\">5<\/span> Par\u00e7al\u0131 (Chunked) Upload Mant\u0131\u011f\u0131<\/a><ul><li><a href=\"#Basit_bir_akis_taslagi\"><span class=\"toc_number toc_depth_2\">5.1<\/span> Basit bir ak\u0131\u015f tasla\u011f\u0131<\/a><\/li><li><a href=\"#API_taslagi_uploadinit_uploadchunk_uploadcomplete\"><span class=\"toc_number toc_depth_2\">5.2<\/span> API tasla\u011f\u0131: \/upload\/init, \/upload\/chunk, \/upload\/complete<\/a><\/li><li><a href=\"#Tarayici_tarafinda_dosyayi_parcalara_ayirmak\"><span class=\"toc_number toc_depth_2\">5.3<\/span> Taray\u0131c\u0131 taraf\u0131nda dosyay\u0131 par\u00e7alara ay\u0131rmak<\/a><\/li><li><a href=\"#Sunucu_tarafinda_parcalari_birlestirmek\"><span class=\"toc_number toc_depth_2\">5.4<\/span> Sunucu taraf\u0131nda par\u00e7alar\u0131 birle\u015ftirmek<\/a><\/li><\/ul><\/li><li><a href=\"#CDN_ve_Object_Storage_ile_Yukleme_Mimarisi_Nasil_Hafifler\"><span class=\"toc_number toc_depth_1\">6<\/span> CDN ve Object Storage ile Y\u00fckleme Mimarisi Nas\u0131l Hafifler?<\/a><ul><li><a href=\"#Object_storage_S3_uyumlu_kullanmak\"><span class=\"toc_number toc_depth_2\">6.1<\/span> Object storage (S3 uyumlu) kullanmak<\/a><\/li><li><a href=\"#CDN_ile_global_dagitim_ve_bant_genisligi_optimizasyonu\"><span class=\"toc_number toc_depth_2\">6.2<\/span> CDN ile global da\u011f\u0131t\u0131m ve bant geni\u015fli\u011fi optimizasyonu<\/a><\/li><li><a href=\"#WordPress_gibi_hazir_sistemlerde_medya_yuklemelerini_tasimak\"><span class=\"toc_number toc_depth_2\">6.3<\/span> WordPress gibi haz\u0131r sistemlerde medya y\u00fcklemelerini ta\u015f\u0131mak<\/a><\/li><\/ul><\/li><li><a href=\"#Tarayici_Tarafinda_Deneyimi_Iyilestirmek_Yeniden_Deneme_Devam_Etme_Paralel_Chunk\"><span class=\"toc_number toc_depth_1\">7<\/span> Taray\u0131c\u0131 Taraf\u0131nda Deneyimi \u0130yile\u015ftirmek: Yeniden Deneme, Devam Etme, Paralel Chunk<\/a><ul><li><a href=\"#Yeniden_deneme_retry_ve_devam_etme\"><span class=\"toc_number toc_depth_2\">7.1<\/span> Yeniden deneme (retry) ve devam etme<\/a><\/li><li><a href=\"#Paralel_chunk_gonderimi\"><span class=\"toc_number toc_depth_2\">7.2<\/span> Paralel chunk g\u00f6nderimi<\/a><\/li><li><a href=\"#Ilerleme_cubugu_tahmini_sure_ve_kullaniciya_net_geri_bildirim\"><span class=\"toc_number toc_depth_2\">7.3<\/span> \u0130lerleme \u00e7ubu\u011fu, tahmini s\u00fcre ve kullan\u0131c\u0131ya net geri bildirim<\/a><\/li><\/ul><\/li><li><a href=\"#Guvenlik_Kota_ve_Kaynak_Yonetimi\"><span class=\"toc_number toc_depth_1\">8<\/span> G\u00fcvenlik, Kota ve Kaynak Y\u00f6netimi<\/a><ul><li><a href=\"#Maksimum_dosya_boyutu_ve_kota_politikalari\"><span class=\"toc_number toc_depth_2\">8.1<\/span> Maksimum dosya boyutu ve kota politikalar\u0131<\/a><\/li><li><a href=\"#Virus_taramasi_ve_icerik_denetimi\"><span class=\"toc_number toc_depth_2\">8.2<\/span> Vir\u00fcs taramas\u0131 ve i\u00e7erik denetimi<\/a><\/li><li><a href=\"#Loglama_ve_izleme\"><span class=\"toc_number toc_depth_2\">8.3<\/span> Loglama ve izleme<\/a><\/li><\/ul><\/li><li><a href=\"#Farkli_Hosting_Senaryolari_Icin_Ornek_Mimariler\"><span class=\"toc_number toc_depth_1\">9<\/span> Farkl\u0131 Hosting Senaryolar\u0131 \u0130\u00e7in \u00d6rnek Mimariler<\/a><ul><li><a href=\"#Senaryo_1_paylasimli_hosting_sinirli_sayida_buyuk_dosya\"><span class=\"toc_number toc_depth_2\">9.1<\/span> Senaryo 1: payla\u015f\u0131ml\u0131 hosting + s\u0131n\u0131rl\u0131 say\u0131da b\u00fcy\u00fck dosya<\/a><\/li><li><a href=\"#Senaryo_2_DCHost_VPS_Object_Storage_CDN\"><span class=\"toc_number toc_depth_2\">9.2<\/span> Senaryo 2: DCHost VPS + Object Storage + CDN<\/a><\/li><li><a href=\"#Senaryo_3_Dedicated_sunucu_yogun_medya_trafigi\"><span class=\"toc_number toc_depth_2\">9.3<\/span> Senaryo 3: Dedicated sunucu + yo\u011fun medya trafi\u011fi<\/a><\/li><\/ul><\/li><li><a href=\"#Operasyonel_Ipuclari_Test_Gozlem_ve_Kademeli_Gecis\"><span class=\"toc_number toc_depth_1\">10<\/span> Operasyonel \u0130pu\u00e7lar\u0131: Test, G\u00f6zlem ve Kademeli Ge\u00e7i\u015f<\/a><\/li><li><a href=\"#Ozet_ve_Yol_Haritasi_Sadece_Limitleri_Yukseltmek_Degil_Mimariyi_Guncellemek_Gerek\"><span class=\"toc_number toc_depth_1\">11<\/span> \u00d6zet ve Yol Haritas\u0131: Sadece Limitleri Y\u00fckseltmek De\u011fil, Mimariyi G\u00fcncellemek Gerek<\/a><\/li><\/ul><\/div>\n<h2><span id=\"Neden_Buyuk_Medya_Dosyalari_Icin_Ayri_Bir_Yukleme_Stratejisi_Gerekir\">Neden B\u00fcy\u00fck Medya Dosyalar\u0131 \u0130\u00e7in Ayr\u0131 Bir Y\u00fckleme Stratejisi Gerekir?<\/span><\/h2>\n<p>Video dersler, y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc \u00fcr\u00fcn g\u00f6rselleri, podcast kay\u0131tlar\u0131 veya kullan\u0131c\u0131lar\u0131n kendi videolar\u0131n\u0131 y\u00fckledi\u011fi platformlar\u2026 T\u00fcm bu senaryolarda ortak sorun, birka\u00e7 y\u00fcz MB hatta GB seviyesindeki dosyalar\u0131n web \u00fczerinden sorunsuz y\u00fcklenmesini sa\u011flamakt\u0131r. Klasik tek seferde form upload yakla\u015f\u0131m\u0131, PHP limitleri, Nginx\/Apache zaman a\u015f\u0131mlar\u0131 ve kullan\u0131c\u0131 taraf\u0131ndaki zay\u0131f ba\u011flant\u0131lar y\u00fcz\u00fcnden s\u0131k s\u0131k duvara toslar.<\/p>\n<p>\u00d6zellikle PHP tabanl\u0131 uygulamalarda; <strong>upload_max_filesize<\/strong>, <strong>post_max_size<\/strong>, <strong>max_execution_time<\/strong> ve <strong>memory_limit<\/strong> gibi ayarlar bir yere kadar esnetilebilir. Ama dosya boyutu b\u00fcy\u00fcd\u00fck\u00e7e, web sunucusunun (Nginx\/Apache) <strong>timeout<\/strong> ve <strong>body size<\/strong> limitleri, a\u011f dalgalanmalar\u0131 ve taray\u0131c\u0131 taraf\u0131ndaki k\u0131s\u0131tlar devreye girer. Sonu\u00e7: Y\u00fcklemenin ortas\u0131nda hata alan kullan\u0131c\u0131lar, bo\u015fa giden bant geni\u015fli\u011fi ve mutsuz destek biletleri.<\/p>\n<p>Bu yaz\u0131da, DCHost ekibi olarak sahada en \u00e7ok kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z sorunlara dayanarak, b\u00fcy\u00fck medya dosyalar\u0131 i\u00e7in <strong>u\u00e7tan uca y\u00fckleme stratejisi<\/strong> anlataca\u011f\u0131z. PHP ve web sunucusu limitlerinin mant\u0131\u011f\u0131n\u0131, Nginx\/Apache zaman a\u015f\u0131m\u0131 ayarlar\u0131n\u0131, <strong>CDN + object storage<\/strong> mimarisini ve en \u00f6nemlisi de <strong>par\u00e7al\u0131 (chunked) upload<\/strong> yakla\u015f\u0131m\u0131n\u0131 ad\u0131m ad\u0131m ele alaca\u011f\u0131z. Hedefimiz, &#8220;\u015fu ayar\u0131 biraz daha y\u00fckseltelim belki d\u00fczelir&#8221; seviyesinden \u00e7\u0131k\u0131p, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir bir mimariye ge\u00e7menizi sa\u011flamak.<\/p>\n<h2><span id=\"PHP_Limitleri_upload_max_filesize_post_max_size_ve_max_execution_time\">PHP Limitleri: upload_max_filesize, post_max_size ve max_execution_time<\/span><\/h2>\n<p>B\u00fcy\u00fck dosya y\u00fcklemelerinde ilk \u00e7arp\u0131\u015fma genellikle PHP taraf\u0131nda ya\u015fan\u0131r. \u00c7\u00fcnk\u00fc klasik form upload ak\u0131\u015f\u0131nda, dosya \u00f6nce web sunucusundan ge\u00e7er, ard\u0131ndan PHP taraf\u0131ndan i\u015flenir. PHP\u2019nin varsay\u0131lan limitlerini bilmeden hareket ederseniz, daha taray\u0131c\u0131 %30\u2019dayken 413 veya 500 hatalar\u0131yla kar\u015f\u0131la\u015fman\u0131z \u00e7ok normal.<\/p>\n<h3><span id=\"Temel_PHP_upload_ayarlari\">Temel PHP upload ayarlar\u0131<\/span><\/h3>\n<p>En kritik PHP ayarlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>upload_max_filesize<\/strong>: Tek bir dosyan\u0131n maksimum boyutu<\/li>\n<li><strong>post_max_size<\/strong>: T\u00fcm POST g\u00f6vdesinin maksimum boyutu (form alanlar\u0131 + dosyalar)<\/li>\n<li><strong>max_execution_time<\/strong>: PHP scriptinin en fazla \u00e7al\u0131\u015fabilece\u011fi s\u00fcre (saniye)<\/li>\n<li><strong>memory_limit<\/strong>: Bir PHP prosesinin kullanabilece\u011fi maksimum bellek<\/li>\n<\/ul>\n<p>Bu ayarlar\u0131 detayl\u0131 anlatt\u0131\u011f\u0131m\u0131z <a href=\"https:\/\/www.dchost.com\/blog\/php-ayarlarini-dogru-yapmak-memory_limit-max_execution_time-ve-upload_max_filesize-kac-olmali\/\">PHP ayarlar\u0131n\u0131 do\u011fru yapmak i\u00e7in haz\u0131rlad\u0131\u011f\u0131m\u0131z rehbere<\/a> mutlaka g\u00f6z atman\u0131z\u0131 \u00f6neririm. Burada sadece b\u00fcy\u00fck dosya ba\u011flam\u0131nda kritik noktalar\u0131 vurgulayal\u0131m.<\/p>\n<h3><span id=\"post_max_size_ve_upload_max_filesize_iliskisi\">post_max_size ve upload_max_filesize ili\u015fkisi<\/span><\/h3>\n<p>Genel kural: <strong>post_max_size &gt;= upload_max_filesize<\/strong> olmal\u0131d\u0131r. \u00d6rne\u011fin 1 GB\u2019l\u0131k tek bir dosyay\u0131 izinli k\u0131lmak istiyorsan\u0131z:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">upload_max_filesize = 1024M\npost_max_size = 1100M\n<\/code><\/pre>\n<p>Araya biraz pay b\u0131rakmak mant\u0131kl\u0131d\u0131r; form alanlar\u0131, ek metadata vs. POST g\u00f6vdesinin toplam boyutunu art\u0131r\u0131r. Ancak bu de\u011ferleri y\u00fckseltmek tek ba\u015f\u0131na yeterli de\u011fildir; hem HTTP sunucusu limitleri hem de PHP\u2019nin \u00e7al\u0131\u015fma s\u00fcresi devreye girer.<\/p>\n<h3><span id=\"max_execution_time_ve_yavas_baglantilar\">max_execution_time ve yava\u015f ba\u011flant\u0131lar<\/span><\/h3>\n<p>\u00d6rne\u011fin 1 GB\u2019l\u0131k bir dosya d\u00fc\u015f\u00fcnelim. Kullan\u0131c\u0131 10 Mbps (yakla\u015f\u0131k 1.25 MB\/s) efektif h\u0131zla y\u00fckleme yapabiliyorsa, teorik minimum s\u00fcre ~13-14 dakika civar\u0131ndad\u0131r. PHP taraf\u0131nda <code>max_execution_time = 120<\/code> (2 dakika) ise, y\u00fckleme hi\u00e7bir zaman tamamlanamayacakt\u0131r.<\/p>\n<p>Bu y\u00fczden, tek seferde b\u00fcy\u00fck dosya upload senaryosunda <code>max_execution_time<\/code> de\u011ferini ciddi \u015fekilde y\u00fckseltmeniz gerekir. Fakat bu da \u015fu riskleri do\u011furur:<\/p>\n<ul>\n<li>Uzun s\u00fcre a\u00e7\u0131k kalan PHP prosesleri, <strong>PHP-FPM havuzunu<\/strong> doldurur, di\u011fer istekler kuyrukta bekler.<\/li>\n<li>Payla\u015f\u0131ml\u0131 hosting veya zay\u0131f <a href=\"https:\/\/www.dchost.com\/tr\/vps\">VPS<\/a> ortamlar\u0131nda CPU ve RAM t\u00fcketimi s\u0131\u00e7rar.<\/li>\n<li>Kullan\u0131c\u0131 ba\u011flant\u0131s\u0131 ortada koparsa, hem s\u00fcre hem kaynak bo\u015fa gider.<\/li>\n<\/ul>\n<p>PHP-FPM havuzu ayarlar\u0131n\u0131 (\u00f6zellikle <code>pm<\/code>, <code>pm.max_children<\/code> ve <code>pm.max_requests<\/code>) boyutland\u0131r\u0131rken y\u00fckleme s\u00fcre\u00e7lerini de hesaba katman\u0131z gerekir. Bu konuda <a href=\"https:\/\/www.dchost.com\/blog\/wordpress-ve-woocommerce-icin-php-fpm-ayarlari-pm-pm-max_children-ve-pm-max_requests-hesaplama-rehberi\/\">PHP-FPM ayarlar\u0131n\u0131 nas\u0131l hesaplayaca\u011f\u0131n\u0131z\u0131 anlatt\u0131\u011f\u0131m\u0131z rehber<\/a> i\u015finize yarayacakt\u0131r.<\/p>\n<h2><span id=\"Nginx_ve_Apache_Zaman_Asimi_Ayarlari_PHPden_Once_Duvara_Toslamak\">Nginx ve Apache Zaman A\u015f\u0131m\u0131 Ayarlar\u0131: PHP\u2019den \u00d6nce Duvara Toslamak<\/span><\/h2>\n<p>Bir\u00e7ok ekip sadece PHP ayarlar\u0131n\u0131 y\u00fckseltti\u011finde sorunun \u00e7\u00f6z\u00fclece\u011fini d\u00fc\u015f\u00fcn\u00fcr. Fakat HTTP iste\u011fi PHP\u2019ye ula\u015fmadan \u00f6nce Nginx veya Apache katman\u0131nda da \u00e7e\u015fitli s\u0131n\u0131rlar vard\u0131r.<\/p>\n<h3><span id=\"Nginx_tarafinda_kritik_direktifler\">Nginx taraf\u0131nda kritik direktifler<\/span><\/h3>\n<ul>\n<li><strong>client_max_body_size<\/strong>: \u0130stek g\u00f6vdesinin (body) maksimum boyutu<\/li>\n<li><strong>client_body_timeout<\/strong>: \u0130stek g\u00f6vdesinin tamam\u0131n\u0131n gelmesi i\u00e7in tan\u0131nan s\u00fcre<\/li>\n<li><strong>send_timeout<\/strong>: Sunucunun yan\u0131t g\u00f6nderirken bekleyece\u011fi maksimum s\u00fcre<\/li>\n<li><strong>proxy_read_timeout<\/strong>: Nginx\u2019in arka uca (PHP-FPM, upstream) yapt\u0131\u011f\u0131 iste\u011fin yan\u0131t\u0131n\u0131 bekleyece\u011fi s\u00fcre<\/li>\n<\/ul>\n<p>\u00d6rnek bir Nginx konfig\u00fcrasyon par\u00e7as\u0131 \u015f\u00f6yle olabilir:<\/p>\n<pre class=\"language-nginx line-numbers\"><code class=\"language-nginx\">server {\n    client_max_body_size 1024M;\n    client_body_timeout 600s;\n\n    location ~ .php$ {\n        include fastcgi_params;\n        fastcgi_pass unix:\/run\/php\/php8.2-fpm.sock;\n        fastcgi_read_timeout 900s;\n    }\n}\n<\/code><\/pre>\n<p>Burada <code>client_max_body_size<\/code> y\u00fckseltilmedi\u011fi durumda, PHP ayarlar\u0131n\u0131 ne kadar b\u00fcy\u00fct\u00fcrseniz b\u00fcy\u00fct\u00fcn, Nginx iste\u011fi daha ba\u015ftan <strong>413 Request Entity Too Large<\/strong> hatas\u0131yla reddeder.<\/p>\n<h3><span id=\"Apache_tarafinda_kritik_direktifler\">Apache taraf\u0131nda kritik direktifler<\/span><\/h3>\n<ul>\n<li><strong>LimitRequestBody<\/strong>: Maksimum istek g\u00f6vdesi boyutu<\/li>\n<li><strong>Timeout<\/strong>: Genel istek\/yan\u0131t zaman a\u015f\u0131m\u0131<\/li>\n<li><strong>ProxyTimeout<\/strong> veya <strong>ProxyPass<\/strong> ile kullan\u0131lan timeout parametreleri<\/li>\n<li><strong>mod_reqtimeout<\/strong> ile <code>RequestReadTimeout<\/code>: G\u00f6vde okuma zaman a\u015f\u0131mlar\u0131<\/li>\n<\/ul>\n<p>Basit bir \u00f6rnek:<\/p>\n<pre class=\"language-apache line-numbers\"><code class=\"language-apache\">&lt;VirtualHost *:80&gt;\n    LimitRequestBody 1073741824  # 1 GB\n    Timeout 900\n\n    &lt;Proxy &quot;fcgi:\/\/php-fpm&quot;&gt;\n        ProxySet connectiontimeout=600 timeout=900\n    &lt;\/Proxy&gt;\n&lt;\/VirtualHost&gt;\n<\/code><\/pre>\n<p>Burada da benzer \u015fekilde; istek g\u00f6vdesi \u00e7ok yava\u015f geliyorsa, <strong>408 Request Timeout<\/strong> veya arkadaki PHP-FPM yan\u0131t vermekte gecikiyorsa <strong>504 Gateway Timeout<\/strong> hatalar\u0131yla kar\u015f\u0131la\u015f\u0131rs\u0131n\u0131z.<\/p>\n<h2><span id=\"Klasik_Form_Upload_Yaklasiminin_Sinirlari\">Klasik Form Upload Yakla\u015f\u0131m\u0131n\u0131n S\u0131n\u0131rlar\u0131<\/span><\/h2>\n<p>Tek seferde, dev bir dosyay\u0131 <code>&lt;input type=\"file\" \/&gt;<\/code> ile form post ederek y\u00fcklemek, ilk bak\u0131\u015fta basit g\u00f6r\u00fcn\u00fcr. Ancak pratikte \u015fu problemlerle bo\u011fu\u015fursunuz:<\/p>\n<ul>\n<li><strong>Ba\u011flant\u0131 dalgalanmalar\u0131<\/strong>: Mobil veya zay\u0131f ba\u011flant\u0131larda upload ortada kopar; ba\u015ftan ba\u015flamak gerekir.<\/li>\n<li><strong>K\u00f6t\u00fc kullan\u0131c\u0131 deneyimi<\/strong>: Taray\u0131c\u0131 bazen uzun s\u00fcre yan\u0131t vermiyor gibi g\u00f6r\u00fcn\u00fcr; net ilerleme bar\u0131 yoktur.<\/li>\n<li><strong>Sunucu kaynak t\u00fcketimi<\/strong>: Uzun s\u00fcren upload\u2019lar PHP-FPM slotlar\u0131n\u0131 me\u015fgul eder, di\u011fer istekler gecikir.<\/li>\n<li><strong>G\u00fcvenli hata y\u00f6netimi zorlu\u011fu<\/strong>: Hangi a\u015famada hata oldu\u011funu anlamak zorla\u015f\u0131r; log analizi karma\u015f\u0131kla\u015f\u0131r.<\/li>\n<\/ul>\n<p>Bu y\u00fczden b\u00fcy\u00fck medya dosyalar\u0131 i\u00e7in art\u0131k end\u00fcstri standard\u0131 diyebilece\u011fimiz yakla\u015f\u0131m, <strong>par\u00e7al\u0131 (chunked) upload<\/strong> mimarisidir.<\/p>\n<h2><span id=\"Parcali_Chunked_Upload_Mantigi\">Par\u00e7al\u0131 (Chunked) Upload Mant\u0131\u011f\u0131<\/span><\/h2>\n<p>Par\u00e7al\u0131 upload\u2019ta dosya, istemci taraf\u0131nda (taray\u0131c\u0131 veya mobil uygulama) mant\u0131ksal par\u00e7alara ayr\u0131l\u0131r. Sunucuya onlarca\/y\u00fczlerce k\u00fc\u00e7\u00fck istekle g\u00f6nderilir. Her par\u00e7a ba\u011f\u0131ms\u0131z olarak do\u011frulan\u0131r ve ge\u00e7ici alana yaz\u0131l\u0131r. T\u00fcm par\u00e7alar ba\u015far\u0131yla geldikten sonra sunucu bu par\u00e7alar\u0131 birle\u015ftirir.<\/p>\n<h3><span id=\"Basit_bir_akis_taslagi\">Basit bir ak\u0131\u015f tasla\u011f\u0131<\/span><\/h3>\n<ol>\n<li><strong>Init iste\u011fi<\/strong>: \u0130stemci, sunucuya dosyan\u0131n boyutu, ad\u0131, tipi ve iste\u011fe ba\u011fl\u0131 olarak hash bilgisini g\u00f6nderir. Sunucu bir <code>upload_id<\/code> \u00fcretir.<\/li>\n<li><strong>Chunk y\u00fcklemeleri<\/strong>: \u0130stemci, dosyan\u0131n 0,1,2\u2026 numaral\u0131 par\u00e7alar\u0131n\u0131 bu <code>upload_id<\/code> ile birlikte g\u00f6nderir.<\/li>\n<li><strong>Tamamlama iste\u011fi<\/strong>: T\u00fcm par\u00e7alar ba\u015far\u0131yla y\u00fcklendikten sonra, istemci &#8220;tamamla&#8221; iste\u011fi atar; sunucu par\u00e7alar\u0131 birle\u015ftirir ve kal\u0131c\u0131 depolamaya ta\u015f\u0131r.<\/li>\n<li><strong>Opsiyonel do\u011frulama<\/strong>: Ba\u015flang\u0131\u00e7ta g\u00f6nderilen checksum\/hash de\u011feriyle birle\u015fmi\u015f dosya kontrol edilir.<\/li>\n<\/ol>\n<h3><span id=\"API_taslagi_uploadinit_uploadchunk_uploadcomplete\">API tasla\u011f\u0131: \/upload\/init, \/upload\/chunk, \/upload\/complete<\/span><\/h3>\n<p>\u00d6rnek bir REST API tasla\u011f\u0131 \u015f\u00f6yle olabilir:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">POST \/upload\/init\nBody (JSON): {\n  &quot;filename&quot;: &quot;video.mp4&quot;,\n  &quot;size&quot;: 734003200,\n  &quot;mime&quot;: &quot;video\/mp4&quot;,\n  &quot;checksum&quot;: &quot;&lt;opsiyonel SHA256&gt;&quot;\n}\n\nResponse: {\n  &quot;upload_id&quot;: &quot;abc123&quot;,\n  &quot;chunk_size&quot;: 5242880  \/\/ 5 MB\n}\n\nPOST \/upload\/chunk\nHeaders:\n  Upload-Id: abc123\n  Chunk-Index: 0\nBody: binary chunk (5 MB)\n\nPOST \/upload\/complete\nBody (JSON): {\n  &quot;upload_id&quot;: &quot;abc123&quot;\n}\n<\/code><\/pre>\n<p>Bu ak\u0131\u015fta, y\u00fckleme s\u00fcreci hi\u00e7bir zaman tek bir devasa HTTP iste\u011fine ba\u011fl\u0131 de\u011fildir. Ba\u011flant\u0131 koparsa, istemci en son hangi chunk\u2019a kadar gitti\u011fini bilir ve sadece eksik par\u00e7alardan devam eder.<\/p>\n<h3><span id=\"Tarayici_tarafinda_dosyayi_parcalara_ayirmak\">Taray\u0131c\u0131 taraf\u0131nda dosyay\u0131 par\u00e7alara ay\u0131rmak<\/span><\/h3>\n<p>Modern taray\u0131c\u0131larda <code>File<\/code> ve <code>Blob<\/code> API\u2019leriyle dosyay\u0131 \u00e7ok kolay par\u00e7alara b\u00f6lebilirsiniz:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">const file = input.files[0];\nconst chunkSize = 5 * 1024 * 1024; \/\/ 5 MB\nlet offset = 0;\nlet index = 0;\n\nwhile (offset &lt; file.size) {\n  const chunk = file.slice(offset, offset + chunkSize);\n\n  await fetch('\/upload\/chunk', {\n    method: 'POST',\n    headers: {\n      'Upload-Id': uploadId,\n      'Chunk-Index': index.toString(),\n    },\n    body: chunk,\n  });\n\n  offset += chunkSize;\n  index++;\n}\n<\/code><\/pre>\n<p>Ger\u00e7ek hayatta elbette <code>async\/await<\/code> yerine daha geli\u015fmi\u015f hata y\u00f6netimi, yeniden deneme (retry) mekanizmas\u0131, h\u0131z limitleme ve kullan\u0131c\u0131ya y\u00fczde bazl\u0131 ilerleme bar\u0131 g\u00f6sterimi gibi detaylar da eklenir.<\/p>\n<h3><span id=\"Sunucu_tarafinda_parcalari_birlestirmek\">Sunucu taraf\u0131nda par\u00e7alar\u0131 birle\u015ftirmek<\/span><\/h3>\n<p>Sunucu taraf\u0131nda yap\u0131lmas\u0131 gerekenler \u00f6zetle:<\/p>\n<ul>\n<li>Her chunk\u2019\u0131 <strong>ge\u00e7ici bir dizine<\/strong> kaydetmek (\u00f6r. <code>\/tmp\/uploads\/&lt;upload_id&gt;\/chunk_0001<\/code>).<\/li>\n<li>Veritaban\u0131nda veya KV store\u2019da hangi chunk\u2019lar\u0131n geldi\u011fini tutmak.<\/li>\n<li>T\u00fcm chunk\u2019lar haz\u0131r oldu\u011funda bunlar\u0131 do\u011fru s\u0131ralamayla birle\u015ftirmek.<\/li>\n<li>Birle\u015fmi\u015f dosyay\u0131 kal\u0131c\u0131 depolamaya (disk, object storage) ta\u015f\u0131mak.<\/li>\n<\/ul>\n<p>PHP ile \u00e7ok basit birle\u015ftirme \u00f6rne\u011fi:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">$uploadId = $_POST['upload_id'];\n$target = &quot;\/data\/final\/{$uploadId}.mp4&quot;;\n\n$chunksDir = &quot;\/tmp\/uploads\/{$uploadId}\/&quot;;\n$chunks = glob($chunksDir . 'chunk_*');\n\nnatsort($chunks);\n\n$dest = fopen($target, 'wb');\n\nforeach ($chunks as $chunk) {\n    $src = fopen($chunk, 'rb');\n    stream_copy_to_stream($src, $dest);\n    fclose($src);\n}\n\nfclose($dest);\n<\/code><\/pre>\n<p>Ger\u00e7ek \u00fcretim ortam\u0131nda, dosya adlar\u0131n\u0131 rastgelele\u015ftirmek, yetkisiz eri\u015fime izin vermemek, paralel birle\u015ftirmelerde yar\u0131\u015f ko\u015fullar\u0131n\u0131 engellemek ve hatal\u0131 y\u00fcklemeleri zaman a\u015f\u0131m\u0131yla otomatik temizlemek gerekir.<\/p>\n<h2><span id=\"CDN_ve_Object_Storage_ile_Yukleme_Mimarisi_Nasil_Hafifler\">CDN ve Object Storage ile Y\u00fckleme Mimarisi Nas\u0131l Hafifler?<\/span><\/h2>\n<p>Par\u00e7al\u0131 upload sadece kullan\u0131c\u0131 deneyimini de\u011fil, sunucu mimarisini de de\u011fi\u015ftirir. B\u00fcy\u00fck medya dosyalar\u0131n\u0131 do\u011frudan web sunucusunun diskinde tutmak yerine, <strong>object storage + CDN<\/strong> kombinasyonuna ta\u015f\u0131mak neredeyse her projede mant\u0131kl\u0131 bir ad\u0131md\u0131r.<\/p>\n<h3><span id=\"Object_storage_S3_uyumlu_kullanmak\">Object storage (S3 uyumlu) kullanmak<\/span><\/h3>\n<p>Object storage, b\u00fcy\u00fck dosyalar i\u00e7in tasarlanm\u0131\u015f, HTTP\/HTTPS \u00fczerinden eri\u015filen bir depolama t\u00fcr\u00fcd\u00fcr. Klasik dosya sistemi (ext4, XFS vb.) yerine <strong>bucket<\/strong> ve <strong>object<\/strong> kavramlar\u0131yla \u00e7al\u0131\u015f\u0131r. Temel avantajlar\u0131:<\/p>\n<ul>\n<li>Uygun maliyetli, neredeyse s\u0131n\u0131rs\u0131z depolama<\/li>\n<li>Versioning, lifecycle policy ve cross-region replication gibi kurumsal \u00f6zellikler<\/li>\n<li>CDN\u2019lerle do\u011fal entegrasyon<\/li>\n<\/ul>\n<p>Object storage kavram\u0131n\u0131 detayl\u0131 anlatt\u0131\u011f\u0131m\u0131z <a href=\"https:\/\/www.dchost.com\/blog\/s3-depolama-nedir\/\">S3 depolama nedir rehberimize<\/a> g\u00f6z atarak, altyap\u0131n\u0131z\u0131 buna g\u00f6re konumland\u0131rabilirsiniz. DCHost taraf\u0131nda da bu tarz mimarilere uygun VPS ve <a href=\"https:\/\/www.dchost.com\/tr\/fiziksel-sunucu\">dedicated sunucu<\/a> \u00e7\u00f6z\u00fcmleriyle object storage sistemlerini (\u00f6rne\u011fin S3 uyumlu MinIO) konumland\u0131rmak olduk\u00e7a yayg\u0131n bir senaryo.<\/p>\n<h3><span id=\"CDN_ile_global_dagitim_ve_bant_genisligi_optimizasyonu\">CDN ile global da\u011f\u0131t\u0131m ve bant geni\u015fli\u011fi optimizasyonu<\/span><\/h3>\n<p>B\u00fcy\u00fck medya dosyalar\u0131n\u0131 her istekte do\u011frudan uygulama sunucusundan servis etmek, hem maliyetli hem de performans anlam\u0131nda verimsizdir. Bunun yerine, dosyay\u0131 object storage\u2019a koyup, \u00f6n\u00fcne bir <strong>CDN<\/strong> koymak en sa\u011fl\u0131kl\u0131 \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p>CDN mant\u0131\u011f\u0131n\u0131 ve ne zaman ger\u00e7ekten ihtiya\u00e7 duydu\u011funuzu anlatt\u0131\u011f\u0131m\u0131z <a href=\"https:\/\/www.dchost.com\/blog\/content-delivery-network-cdn-nedir-web-siteniz-icin-avantajlari\/\">CDN nedir ve web siteniz i\u00e7in avantajlar\u0131 nelerdir ba\u015fl\u0131kl\u0131 yaz\u0131<\/a> ile bu konuyu derinlemesine inceleyebilirsiniz.<\/p>\n<p>\u00d6zetle mimari \u015f\u00f6yle olur:<\/p>\n<ol>\n<li>\u0130stemci, uygulama API\u2019nize par\u00e7al\u0131 upload ile dosyay\u0131 g\u00f6nderir.<\/li>\n<li>Uygulama sunucusu, birle\u015ftirilmi\u015f dosyay\u0131 object storage\u2019a y\u00fckler.<\/li>\n<li>Uygulama, kullan\u0131c\u0131lara bu dosyan\u0131n CDN \u00fczerinden eri\u015filecek URL\u2019sini d\u00f6ner.<\/li>\n<li>Kullan\u0131c\u0131lar art\u0131k dosyay\u0131 do\u011frudan CDN edge noktalar\u0131ndan \u00e7eker.<\/li>\n<\/ol>\n<p>B\u00f6ylece:<\/p>\n<ul>\n<li>Uygulama sunucunuzun bant geni\u015fli\u011fi ve CPU y\u00fck\u00fc ciddi oranda azal\u0131r.<\/li>\n<li>Farkl\u0131 lokasyonlardaki kullan\u0131c\u0131lara daha d\u00fc\u015f\u00fck <strong>TTFB<\/strong> ve daha stabil h\u0131zlar sunabilirsiniz.<\/li>\n<\/ul>\n<h3><span id=\"WordPress_gibi_hazir_sistemlerde_medya_yuklemelerini_tasimak\">WordPress gibi haz\u0131r sistemlerde medya y\u00fcklemelerini ta\u015f\u0131mak<\/span><\/h3>\n<p>E\u011fer altyap\u0131n\u0131z WordPress gibi haz\u0131r bir CMS\u2019e dayan\u0131yorsa, benzer mant\u0131\u011f\u0131 eklentilerle kurmak m\u00fcmk\u00fcnd\u00fcr. <a href=\"https:\/\/www.dchost.com\/blog\/wordpress-medyani-s3e-tasiyalim-mi-cdn-imzali-url-ve-onbellek-gecersizlestirme-adim-adim\/\">WordPress medyan\u0131z\u0131 S3\u2019e ta\u015f\u0131ma rehberimizde<\/a> hem object storage kullan\u0131m\u0131n\u0131, hem de CDN ile imzal\u0131 URL ve cache ge\u00e7ersizle\u015ftirme stratejilerini ad\u0131m ad\u0131m anlatt\u0131k. Ayn\u0131 fikirleri \u00f6zel geli\u015ftirilmi\u015f PHP\/Laravel veya Node.js projelerinize de kolayca uyarlayabilirsiniz.<\/p>\n<h2><span id=\"Tarayici_Tarafinda_Deneyimi_Iyilestirmek_Yeniden_Deneme_Devam_Etme_Paralel_Chunk\">Taray\u0131c\u0131 Taraf\u0131nda Deneyimi \u0130yile\u015ftirmek: Yeniden Deneme, Devam Etme, Paralel Chunk<\/span><\/h2>\n<p>Par\u00e7al\u0131 upload sadece sunucunun y\u00fck\u00fcn\u00fc hafifletmekle kalmaz; kullan\u0131c\u0131 deneyimini de dramatik \u015fekilde iyile\u015ftirir.<\/p>\n<h3><span id=\"Yeniden_deneme_retry_ve_devam_etme\">Yeniden deneme (retry) ve devam etme<\/span><\/h3>\n<p>Her chunk ba\u011f\u0131ms\u0131z bir HTTP iste\u011fi oldu\u011fu i\u00e7in, bir veya birka\u00e7 chunk ba\u015far\u0131s\u0131z oldu\u011funda istemci sadece bu par\u00e7alar\u0131 <strong>yeniden deneyebilir<\/strong>. Ayr\u0131ca taray\u0131c\u0131 veya uygulama kapan\u0131p a\u00e7\u0131ld\u0131\u011f\u0131nda, <code>upload_id<\/code> ve gelen chunk listesi sunucudan sorgulanarak <strong>kald\u0131\u011f\u0131 yerden devam<\/strong> ettirilebilir.<\/p>\n<h3><span id=\"Paralel_chunk_gonderimi\">Paralel chunk g\u00f6nderimi<\/span><\/h3>\n<p>Tek bir b\u00fcy\u00fck iste\u011fe k\u0131yasla, 4-8 chunk\u2019\u0131 ayn\u0131 anda g\u00f6ndermek genellikle daha iyi hat kullan\u0131m\u0131 sa\u011flar. Ancak bu say\u0131y\u0131 a\u015f\u0131r\u0131ya ka\u00e7\u0131rmamak gerekir; aksi halde:<\/p>\n<ul>\n<li>Sunucuya gereksiz say\u0131da e\u015f zamanl\u0131 ba\u011flant\u0131 a\u00e7ars\u0131n\u0131z.<\/li>\n<li>Taray\u0131c\u0131 taraf\u0131nda da ba\u011flant\u0131 limitlerine (\u00f6zellikle HTTP\/1.1) tak\u0131labilirsiniz.<\/li>\n<\/ul>\n<p>Pratikte 3-6 paralel chunk iste\u011fi \u00e7o\u011fu proje i\u00e7in tatl\u0131 noktad\u0131r. Bu say\u0131y\u0131 kullan\u0131c\u0131 ba\u011flant\u0131 kalitesine ve sunucu kapasitesine g\u00f6re dinamik de ayarlayabilirsiniz.<\/p>\n<h3><span id=\"Ilerleme_cubugu_tahmini_sure_ve_kullaniciya_net_geri_bildirim\">\u0130lerleme \u00e7ubu\u011fu, tahmini s\u00fcre ve kullan\u0131c\u0131ya net geri bildirim<\/span><\/h3>\n<p>Par\u00e7al\u0131 upload ile her chunk\u2019\u0131n boyutu ve ba\u015far\u0131 durumu bilindi\u011fi i\u00e7in, toplam ilerlemeyi y\u00fczde olarak \u00e7ok net g\u00f6sterebilirsiniz. Kullan\u0131c\u0131ya \u00f6rne\u011fin &#8220;%43 y\u00fcklendi, tahmini kalan s\u00fcre: 2 dakika&#8221; gibi bilgiler vermek, uzun s\u00fcren upload s\u00fcre\u00e7lerinde destek y\u00fck\u00fcn\u00fc de ciddi \u015fekilde azalt\u0131r.<\/p>\n<h2><span id=\"Guvenlik_Kota_ve_Kaynak_Yonetimi\">G\u00fcvenlik, Kota ve Kaynak Y\u00f6netimi<\/span><\/h2>\n<p>B\u00fcy\u00fck dosya y\u00fckleme imkan\u0131 sunmak, k\u00f6t\u00fc niyetli kullan\u0131c\u0131lar i\u00e7in de cazip bir hedef yarat\u0131r. Mimarinizde a\u015fa\u011f\u0131daki unsurlar\u0131 mutlaka d\u00fc\u015f\u00fcnmelisiniz:<\/p>\n<h3><span id=\"Maksimum_dosya_boyutu_ve_kota_politikalari\">Maksimum dosya boyutu ve kota politikalar\u0131<\/span><\/h3>\n<ul>\n<li>Kullan\u0131c\u0131 ba\u015f\u0131na g\u00fcnl\u00fck \/ ayl\u0131k toplam upload kotas\u0131<\/li>\n<li>Tek dosya i\u00e7in maksimum boyut<\/li>\n<li>Projeye g\u00f6re MIME type \/ uzant\u0131 beyaz listesi<\/li>\n<\/ul>\n<p>Bu limitleri sadece PHP\/Nginx\u2019te de\u011fil, <strong>uygulama mant\u0131\u011f\u0131n\u0131zda<\/strong> da kontrol edin. Yani kullan\u0131c\u0131, init iste\u011fi att\u0131\u011f\u0131nda dosya boyutu ve tipi kabul edilebilir aral\u0131kta de\u011filse <strong>hen\u00fcz ilk chunk gelmeden<\/strong> reddedilmeli.<\/p>\n<h3><span id=\"Virus_taramasi_ve_icerik_denetimi\">Vir\u00fcs taramas\u0131 ve i\u00e7erik denetimi<\/span><\/h3>\n<p>\u00c7ok kirac\u0131l\u0131 (multi-tenant) SaaS projelerinde veya herkese a\u00e7\u0131k y\u00fckleme imkan\u0131 verdi\u011finiz platformlarda, dosyalar\u0131n en az\u0131ndan temel bir <strong>antivir\u00fcs taramas\u0131ndan<\/strong> ge\u00e7mesi kritik olabilir. Bunu upload ak\u0131\u015f\u0131ndan tamamen ayr\u0131, <strong>asenkron bir i\u015f kuyru\u011fu<\/strong> ile \u00e7\u00f6zmek en do\u011frusudur:<\/p>\n<ol>\n<li>Upload tamamlan\u0131r, dosya object storage\u2019a al\u0131n\u0131r.<\/li>\n<li>Bir i\u015f kuyru\u011fu (queue) kayd\u0131 olu\u015fur: &#8220;dosya_id = X, taranacak&#8221;.<\/li>\n<li>Arka planda \u00e7al\u0131\u015fan worker, dosyay\u0131 \u00e7ekip tarar, sonucu veritaban\u0131na i\u015fler.<\/li>\n<li>\u015e\u00fcpheli i\u00e7erikler otomatik olarak eri\u015fime kapat\u0131l\u0131r veya manuel onaya d\u00fc\u015fer.<\/li>\n<\/ol>\n<h3><span id=\"Loglama_ve_izleme\">Loglama ve izleme<\/span><\/h3>\n<p>B\u00fcy\u00fck dosya upload\u2019lar\u0131nda sorun \u00e7\u0131kt\u0131\u011f\u0131nda k\u00f6k nedeni anlamak i\u00e7in iyi loglama \u015fartt\u0131r:<\/p>\n<ul>\n<li>Web sunucusu (Nginx\/Apache) access ve error loglar\u0131<\/li>\n<li>PHP-FPM loglar\u0131 (slow log dahil)<\/li>\n<li>Uygulama loglar\u0131: <code>upload_id<\/code>, kullan\u0131c\u0131 kimli\u011fi, chunk index, hata kodu<\/li>\n<\/ul>\n<p>Sunucu loglar\u0131n\u0131 daha iyi okumak ve 4xx\u20135xx hatalar\u0131n\u0131n kayna\u011f\u0131n\u0131 te\u015fhis etmek i\u00e7in haz\u0131rlad\u0131\u011f\u0131m\u0131z <a href=\"https:\/\/www.dchost.com\/blog\/hosting-sunucu-loglarini-okumayi-ogrenin-apache-ve-nginx-ile-4xx-5xx-hatalarini-teshis-rehberi\/\">Nginx ve Apache loglar\u0131n\u0131 okuma rehberine<\/a> mutlaka g\u00f6z at\u0131n. B\u00fcy\u00fck upload hatalar\u0131nda oradaki y\u00f6ntemler do\u011frudan i\u015finize yarayacakt\u0131r.<\/p>\n<h2><span id=\"Farkli_Hosting_Senaryolari_Icin_Ornek_Mimariler\">Farkl\u0131 Hosting Senaryolar\u0131 \u0130\u00e7in \u00d6rnek Mimariler<\/span><\/h2>\n<p>DCHost taraf\u0131nda g\u00f6rd\u00fc\u011f\u00fcm\u00fcz projelerde, y\u00fckleme mimarisi genellikle kullan\u0131lan hosting t\u00fcr\u00fcne g\u00f6re \u015fekilleniyor. Birka\u00e7 tipik senaryoyu \u00f6zetleyelim.<\/p>\n<h3><span id=\"Senaryo_1_paylasimli_hosting_sinirli_sayida_buyuk_dosya\">Senaryo 1: <a href=\"https:\/\/www.dchost.com\/tr\/web-hosting\">payla\u015f\u0131ml\u0131 hosting<\/a> + s\u0131n\u0131rl\u0131 say\u0131da b\u00fcy\u00fck dosya<\/span><\/h3>\n<p>K\u00fc\u00e7\u00fck bir e\u011fitim sitesi d\u00fc\u015f\u00fcnelim; ayda birka\u00e7 kez 200\u2013300 MB\u2019l\u0131k video y\u00fckleniyor, kullan\u0131c\u0131 say\u0131s\u0131 \u00e7ok y\u00fcksek de\u011fil. Burada:<\/p>\n<ul>\n<li>PHP ve Nginx\/Apache limitleri makul seviyede y\u00fckseltilebilir.<\/li>\n<li>Par\u00e7al\u0131 upload tek endpoint \u00fczerinden bile ciddi fark yarat\u0131r.<\/li>\n<li>Dosyalar ba\u015flang\u0131\u00e7ta lokal diskte tutulup, periyodik olarak daha kal\u0131c\u0131 depolamaya ta\u015f\u0131nabilir.<\/li>\n<\/ul>\n<p>Payla\u015f\u0131ml\u0131 hosting\u2019in CPU\/RAM limitlerine \u00e7ok yakla\u015fmadan, nispeten basit bir par\u00e7al\u0131 upload kurgusuyla bu senaryo y\u00fcr\u00fct\u00fclebilir.<\/p>\n<h3><span id=\"Senaryo_2_DCHost_VPS_Object_Storage_CDN\">Senaryo 2: DCHost VPS + Object Storage + CDN<\/span><\/h3>\n<p>Orta \u00f6l\u00e7ekli bir SaaS veya e-ticaret altyap\u0131s\u0131 i\u00e7in \u00f6nerdi\u011fimiz mimari genelde \u015f\u00f6yledir:<\/p>\n<ul>\n<li>Uygulama, bir veya birden fazla <strong>DCHost VPS<\/strong> \u00fczerinde \u00e7al\u0131\u015f\u0131r.<\/li>\n<li>Medya dosyalar\u0131, ayr\u0131 bir object storage katman\u0131nda tutulur.<\/li>\n<li>Statik i\u00e7erik ve medyalar CDN \u00fczerinden da\u011f\u0131t\u0131l\u0131r.<\/li>\n<li>Upload i\u015flemi, par\u00e7al\u0131 upload ile API sunucusuna, oradan da object storage\u2019a akar.<\/li>\n<\/ul>\n<p>Bu mimaride, hem web uygulamas\u0131n\u0131 hem de medya trafi\u011fini ayr\u0131 ayr\u0131 \u00f6l\u00e7eklemek \u00e7ok daha kolayla\u015f\u0131r. Ayr\u0131ca CDN ve g\u00f6r\u00fcnt\u00fc optimizasyonu taraf\u0131n\u0131 da devreye almak isterseniz, <a href=\"https:\/\/www.dchost.com\/blog\/goruntu-optimizasyonu-boru-hatti-nasil-kurulur-avif-webp-origin-shield-ve-akilli-cache-key-ile-cdn-faturaniza-nefes-aldirin\/\">g\u00f6r\u00fcnt\u00fc optimizasyonu boru hatt\u0131 rehberimizde<\/a> AVIF\/WebP d\u00f6n\u00fc\u015f\u00fcm\u00fc ve CDN cache stratejilerini ayr\u0131nt\u0131l\u0131 olarak anlatt\u0131k.<\/p>\n<h3><span id=\"Senaryo_3_Dedicated_sunucu_yogun_medya_trafigi\">Senaryo 3: Dedicated sunucu + yo\u011fun medya trafi\u011fi<\/span><\/h3>\n<p>G\u00fcnl\u00fck on binlerce b\u00fcy\u00fck dosya y\u00fcklemesi ve indirmesi yapan platformlarda, genellikle:<\/p>\n<ul>\n<li>Upload API\u2019si i\u00e7in ayr\u0131 bir <strong>dedicated sunucu<\/strong> veya g\u00fc\u00e7l\u00fc VPS havuzu<\/li>\n<li>Arka planda \u00e7al\u0131\u015fan medya i\u015fleme (transcoding, thumbnail \u00fcretimi) kuyru\u011fu<\/li>\n<li>\u00c7ok b\u00f6lgeli CDN ve co\u011frafi \u00e7o\u011faltmal\u0131 object storage<\/li>\n<\/ul>\n<p>gibi daha karma\u015f\u0131k kurgular kullan\u0131yoruz. Burada en \u00f6nemli konu, upload trafi\u011fini ana uygulama trafi\u011finden olabildi\u011fince ay\u0131rmak ve her katman\u0131n (uygulama, depolama, CDN) ayr\u0131 ayr\u0131 \u00f6l\u00e7eklenebilmesi.<\/p>\n<h2><span id=\"Operasyonel_Ipuclari_Test_Gozlem_ve_Kademeli_Gecis\">Operasyonel \u0130pu\u00e7lar\u0131: Test, G\u00f6zlem ve Kademeli Ge\u00e7i\u015f<\/span><\/h2>\n<p>B\u00fcy\u00fck dosya upload stratejisini bir gecede tamamen de\u011fi\u015ftirmek zorunda de\u011filsiniz. DCHost taraf\u0131nda projelerle \u00e7al\u0131\u015f\u0131rken genellikle \u015fu ad\u0131mlarla ilerliyoruz:<\/p>\n<ol>\n<li>\u00d6nce mevcut sistemdeki en b\u00fcy\u00fck dosya boyutlar\u0131n\u0131, hata oranlar\u0131n\u0131 ve tipik kullan\u0131c\u0131 ba\u011flant\u0131 h\u0131zlar\u0131n\u0131 \u00f6l\u00e7\u00fcyoruz.<\/li>\n<li>PHP ve Nginx\/Apache limitlerini, yaln\u0131zca ihtiyac\u0131n\u0131z kadar esnetiyoruz.<\/li>\n<li>Yeni par\u00e7al\u0131 upload API\u2019sini k\u00fc\u00e7\u00fck bir kullan\u0131c\u0131 grubuna a\u00e7\u0131yoruz.<\/li>\n<li>Log ve metrikleri takip ederek, timeout ve chunk boyutlar\u0131n\u0131 optimize ediyoruz.<\/li>\n<li>Son a\u015famada, klasik upload yolunu tamamen kapat\u0131p herkes i\u00e7in par\u00e7al\u0131 upload\u2019a ge\u00e7iyoruz.<\/li>\n<\/ol>\n<p>B\u00f6yle bir kademeli ge\u00e7i\u015f plan\u0131, hem teknik riskleri azalt\u0131r hem de ekip i\u00e7indeki \u00f6\u011frenme s\u00fcrecini daha y\u00f6netilebilir hale getirir.<\/p>\n<h2><span id=\"Ozet_ve_Yol_Haritasi_Sadece_Limitleri_Yukseltmek_Degil_Mimariyi_Guncellemek_Gerek\">\u00d6zet ve Yol Haritas\u0131: Sadece Limitleri Y\u00fckseltmek De\u011fil, Mimariyi G\u00fcncellemek Gerek<\/span><\/h2>\n<p>B\u00fcy\u00fck medya dosyalar\u0131 i\u00e7in sa\u011fl\u0131kl\u0131 bir y\u00fckleme deneyimi, sadece <code>upload_max_filesize<\/code> ve <code>client_max_body_size<\/code> de\u011ferlerini y\u00fckseltmekle \u00e7\u00f6z\u00fclecek bir konu de\u011fil. Taray\u0131c\u0131, PHP, Nginx\/Apache, depolama ve CDN katmanlar\u0131n\u0131n hepsini birlikte d\u00fc\u015f\u00fcnmek gerekiyor. Par\u00e7al\u0131 (chunked) upload yakla\u015f\u0131m\u0131, hem kullan\u0131c\u0131 deneyimini hem de sunucu taraf\u0131 kaynak kullan\u0131m\u0131n\u0131 k\u00f6kten iyile\u015ftiriyor.<\/p>\n<p>Bu yaz\u0131da, PHP ve web sunucusu limitlerinin mant\u0131\u011f\u0131n\u0131, Nginx\/Apache timeout ayarlar\u0131n\u0131, object storage + CDN mimarisini ve par\u00e7al\u0131 upload\u2019\u0131n temel tasar\u0131m\u0131n\u0131 \u00f6zetledik. Bir sonraki ad\u0131mda, projenizin trafik profilini, medya boyutlar\u0131n\u0131 ve b\u00fcy\u00fcme plan\u0131n\u0131 masaya yat\u0131r\u0131p, size \u00f6zel bir y\u00fckleme mimarisi tasarlamak en do\u011frusu olacakt\u0131r.<\/p>\n<p>E\u011fer b\u00fcy\u00fck dosya y\u00fckleme s\u00fcre\u00e7leriniz s\u0131k s\u0131k hata \u00fcretiyorsa, kullan\u0131c\u0131lar\u0131n\u0131zdan &#8220;y\u00fckleme yar\u0131da kald\u0131&#8221; \u015fikayetleri geliyorsa veya mevcut sunucunuz bu trafi\u011fi ta\u015f\u0131makta zorlan\u0131yorsa, DCHost ekibi olarak <strong>uygulama + altyap\u0131<\/strong> taraf\u0131n\u0131 birlikte ele alabilece\u011fimiz bir mimari \u00e7al\u0131\u015ftay yapabiliriz. Yeni bir VPS, dedicated sunucu ya da mevcut altyap\u0131n\u0131z \u00fczerinde, s\u00fcrd\u00fcr\u00fclebilir bir <strong>b\u00fcy\u00fck medya dosyalar\u0131 y\u00fckleme stratejisi<\/strong> kurmak i\u00e7in bizimle ileti\u015fime ge\u00e7meniz yeterli.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u0130&ccedil;indekiler1 Neden B\u00fcy\u00fck Medya Dosyalar\u0131 \u0130\u00e7in Ayr\u0131 Bir Y\u00fckleme Stratejisi Gerekir?2 PHP Limitleri: upload_max_filesize, post_max_size ve max_execution_time2.1 Temel PHP upload ayarlar\u01312.2 post_max_size ve upload_max_filesize ili\u015fkisi2.3 max_execution_time ve yava\u015f ba\u011flant\u0131lar3 Nginx ve Apache Zaman A\u015f\u0131m\u0131 Ayarlar\u0131: PHP\u2019den \u00d6nce Duvara Toslamak3.1 Nginx taraf\u0131nda kritik direktifler3.2 Apache taraf\u0131nda kritik direktifler4 Klasik Form Upload Yakla\u015f\u0131m\u0131n\u0131n S\u0131n\u0131rlar\u01315 Par\u00e7al\u0131 (Chunked) Upload [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3129,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-3128","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-teknoloji"],"_links":{"self":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/3128","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/comments?post=3128"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/3128\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/3129"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=3128"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=3128"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=3128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}