Вы можете моделировать свои действия как команды , которые вы держите в двух стеках. Один для отмены, другой для повтора. Вы можете скомпоновать команды для создания более высокоуровневых команд, например, когда вы хотите отменить действия макроса; или если вы хотите группировать отдельные нажатия одного слова или фразы в одном действии.
Каждое действие в вашем редакторе (или повторное действие) генерирует новую команду отмены, которая поступает в стек отмены ( а также очищает стек повтора). Каждое действие отмены создает соответствующую команду redo, которая переходит в стек повтора.
Вы также можете, как упоминалось в комментариях derekerdmann , объединить команды отмены и повтора в один тип команды, которая знает, как отменить и повторить действие.
Чтобы заставить cURL следовать перенаправлению, используйте:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
Эмм... Я не думаю, что вы действительно выполняете curl... Попробуйте:
curl_exec($ch);
... после установки опций и перед вызовом curl_getinfo()
.
EDIT: Если вы просто хотите узнать, куда перенаправляет страница, я бы воспользовался советом здесь, и просто использовал Curl для захвата заголовков и извлечения из них заголовка Location::
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if (preg_match('~Location: (.*)~i', $result, $match)) {
$location = trim($match[1]);
}