Tôi nhận ra đây là một năm cũ, nhưng tôi chỉ vấp khi đặt câu hỏi trong khi thực hiện một số nghiên cứu bản thân mình về khóa trong PHP.
Nó xảy ra với tôi rằng một giải pháp có thể là có thể bằng cách sử dụng APC chính nó. Hãy gọi cho tôi điên, nhưng điều này có thể là một cách tiếp cận hoàn toàn khả thi:
function acquire_lock($key, $expire=60) {
if (is_locked($key)) {
return null;
}
return apc_store($key, true, $expire);
}
function release_lock($key) {
if (!is_locked($key)) {
return null;
}
return apc_delete($key);
}
function is_locked($key) {
return apc_fetch($key);
}
// example use
if (acquire_lock("foo")) {
do_something_that_requires_a_lock();
release_lock("foo");
}
Trên thực tế tôi có thể vứt chức năng khác trong đó để tạo ra một chìa khóa để sử dụng ở đây, chỉ cần để ngăn chặn va chạm với một chìa khóa APC hiện có, ví dụ:
function key_for_lock($str) {
return md5($str."locked");
}
Thông số $expire
là một tính năng tốt đẹp của APC để sử dụng, vì nó ngăn khóa của bạn bị giữ mãi nếu tập lệnh của bạn bị chết hoặc tương tự.
Hy vọng câu trả lời này hữu ích cho bất kỳ ai khác tình cờ gặp ở đây một năm sau đó.
Biến chứa, chính xác; tại sao bạn lo lắng về khóa? Bạn có thể giải quyết được vấn đề. – Rob
Cảnh báo từ (muộn): MySQL GET_LOCK() có hành vi rất nguy hiểm.Một GET_LOCK() thứ hai lặng lẽ giải phóng khóa cũ trên cùng một kết nối. MySQL chỉ có thể giữ một khóa cho mỗi kết nối. Khóa lồng nhau là không thể với chứng khoán MySQL. Nó không nên được sử dụng cho mục đích chung khóa. – korkman