হালনাগাদ
আমি সমস্যাটি সমাধান করেছি এবং একটি উত্তর পোস্ট করেছি। তবে, আমার সমাধানটি 100% আদর্শ নয়। আমি বরং কেবল symlink
এর cache
সাথে clearstatcache(true, $target)
বা এটি থেকে সরিয়ে ফেলব clearstatcache(true, $link)
যা কার্যকর হয় না।
আমি প্রথমে সিমলিংকগুলির ক্যাচিং প্রতিরোধ করতে বা सि্যামলিংকটি তৈরির সাথে সাথেই ক্যাশে থেকে সরিয়ে ফেলতে চাই। দুর্ভাগ্যক্রমে, আমার সাথে ভাগ্য ছিল না। কোনও কারণে clearstatcache(true)
সিমলিংক তৈরির পরে কাজ হয় না, এটি এখনও ক্যাশে হয়ে যায়।
আমি আনন্দের সাথে যে কাউকে আমার উত্তরটি উন্নত করতে এবং এই সমস্যাগুলি সমাধান করতে পারে তাকে অনুদান প্রদান করব ।
সম্পাদন করা
আমি clearstatcache
প্রতিবার চালিত হওয়া একটি ফাইল তৈরি করে আমার কোডটি অনুকূলিত করার চেষ্টা করেছি যাতে প্রতিটি সিমলিংকের জন্য আমাকে কেবল একবার ক্যাশে সাফ করতে হবে। কিছু কারণে, এটি কাজ করে না। clearstatcache
পথটিতে অন্তর্ভুক্ত থাকাতে প্রতিবারই symlink
ডাকার দরকার হয়, তবে কেন? আমার কাছে থাকা সমাধানটি অপ্টিমাইজ করার একটি উপায় থাকতে হবে।
আমি PHP 7.3.5
সাথে ব্যবহার করছি nginx/1.16.0
। কখনও কখনও file_get_contents
একটি ব্যবহার করার সময় ভুল মান প্রদান করে symlink
। সমস্যাটি একটি সিমিলিংক মোছার এবং পুনরায় তৈরি করার পরে, এর পুরানো মানটি ক্যাশে রয়েছে। কখনও কখনও সঠিক মান ফিরে আসে, কখনও কখনও পুরানো মান। এটি এলোমেলো প্রদর্শিত হয়।
আমি ক্যাশে সাফ করার চেষ্টা করেছি বা এর সাহায্যে ক্যাশে প্রতিরোধ করেছি:
function symlink1($target, $link)
{
realpath_cache_size(0);
symlink($target, $link);
//clearstatcache(true);
}
আমি সত্যিই ক্যাচিং অক্ষম করতে চাই না তবে আমার এখনও ফাইল_জেট_কন্টেন্টের সাথে 100% নির্ভুলতা প্রয়োজন need
সম্পাদন করা
আমি আমার উত্স কোডটি পোস্ট করতে পারছি না, কারণ এটি অনেক দীর্ঘ এবং জটিল, তাই আমি একটি ন্যূনতম, পুনরুত্পাদনযোগ্য উদাহরণ তৈরি করেছি (index.php) যা সমস্যাটি পুনরায় তৈরি করে:
<h1>Symlink Problem</h1>
<?php
$dir = getcwd();
if (isset($_POST['clear-all']))
{
$nos = array_values(array_diff(scandir($dir.'/nos'), array('..', '.')));
foreach ($nos as $no)
{
unlink($dir.'/nos/'.$no.'/id.txt');
rmdir($dir.'/nos/'.$no);
}
foreach (array_values(array_diff(scandir($dir.'/ids'), array('..', '.'))) as $id)
unlink($dir.'/ids/'.$id);
}
if (!is_dir($dir.'/nos'))
mkdir($dir.'/nos');
if (!is_dir($dir.'/ids'))
mkdir($dir.'/ids');
if (isset($_POST['submit']) && !empty($_POST['id']) && ctype_digit($_POST['insert-after']) && ctype_alnum($_POST['id']))
{
$nos = array_values(array_diff(scandir($dir.'/nos'), array('..', '.')));
$total = count($nos);
if ($total <= 100)
{
for ($i = $total; $i >= $_POST['insert-after']; $i--)
{
$id = file_get_contents($dir.'/nos/'.$i.'/id.txt');
unlink($dir.'/ids/'.$id);
symlink($dir.'/nos/'.($i + 1), $dir.'/ids/'.$id);
rename($dir.'/nos/'.$i, $dir.'/nos/'.($i + 1));
}
echo '<br>';
mkdir($dir.'/nos/'.$_POST['insert-after']);
file_put_contents($dir.'/nos/'.$_POST['insert-after'].'/id.txt', $_POST['id']);
symlink($dir.'/nos/'.$_POST['insert-after'], $dir.'/ids/'.$_POST['id']);
}
}
$nos = array_values(array_diff(scandir($dir.'/nos'), array('..', '.')));
$total = count($nos) + 1;
echo '<h2>Ids from nos directory</h2>';
foreach ($nos as $no)
{
echo ($no + 1).':'.file_get_contents("$dir/nos/$no/id.txt").'<br>';
}
echo '<h2>Ids from using symlinks</h2>';
$ids = array_values(array_diff(scandir($dir.'/ids'), array('..', '.')));
if (count($ids) > 0)
{
$success = true;
foreach ($ids as $id)
{
$id1 = file_get_contents("$dir/ids/$id/id.txt");
echo $id.':'.$id1.'<br>';
if ($id !== $id1)
$success = false;
}
if ($success)
echo '<b><font color="blue">Success!</font></b><br>';
else
echo '<b><font color="red">Failure!</font></b><br>';
}
?>
<br>
<h2>Insert ID after</h2>
<form method="post" action="/">
<select name="insert-after">
<?php
for ($i = 0; $i < $total; $i++)
echo '<option value="'.$i.'">'.$i.'</option>';
?>
</select>
<input type="text" placeholder="ID" name="id"><br>
<input type="submit" name="submit" value="Insert"><br>
</form>
<h2>Clear all</h2>
<form method="post" action="/">
<input type="submit" name="clear-all" value="Clear All"><br>
</form>
<script>
if (window.history.replaceState)
{
window.history.replaceState( null, null, window.location.href );
}
</script>
এটি Nginx
কনফিগারেশনে সমস্যা বলে মনে হয়েছে । এই লাইন না থাকা সমস্যার কারণ হতে পারে:
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
এখানে আমার Nginx
কনফিগারেশন (আপনি দেখতে পাচ্ছেন যে আমি উপরের লাইনগুলি অন্তর্ভুক্ত করেছি):
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.websemantica.co.uk;
root "/path/to/site/root";
index index.php;
location / {
try_files $uri $uri/ $uri.php$is_args$query_string;
}
location ~* \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $realpath_root$fastcgi_path_info;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTPS $https;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
fastcgi_index index.php;
fastcgi_read_timeout 3000;
}
if ($request_uri ~ (?i)^/([^?]*)\.php($|\?)) {
return 301 /$1$is_args$args;
}
rewrite ^/index$ / permanent;
rewrite ^/(.*)/$ /$1 permanent;
}
বর্তমানে আমার উপরের উদাহরণটি https://www.websemantica.co.uk এ লাইভ রয়েছে ।
ফর্মটিতে কয়েকটি মান যুক্ত করার চেষ্টা করুন। এটি Success!
প্রতিবার নীল রঙে প্রদর্শন করা উচিত । কখনও কখনও শো Failure!
লাল হয়। এটা বেশ কয়েক পৃষ্ঠা রিফ্রেশ নেওয়া থেকে পরিবর্তন করতে পারেন Success!
করতে Failure!
বা সহ-বিপরীতভাবে। অবশেষে, এটি Success!
প্রতিবার প্রদর্শিত হবে , সুতরাং কিছু ধরণের ক্যাশে সমস্যা থাকতে হবে।
realpath
সঙ্গে file_get_conents
এবং কোন সৌভাগ্য কামনা করছি। এটি এখনও মাঝে মাঝে ক্যাশে থেকে লোড হয়।
realpath
, তবে এমন কিছুclearstatcache(true); file_get_conents(realpath($fileName));
realpath
ফাংশন পৃষ্ঠায় খুব দরকারী মন্তব্য পেয়েছি । হতে পারে এটি আপনাকে সাহায্য করতে পারে।