Я делаю put, затем удаляю файл, т.е.
put
$sftp->put($filename_dest, $filename, NET_SFTP_LOCAL_FILE); unlink($filename);
Это безопасно или put асинхронно?
Это синхронно.Под капотом он в основном просто делает цикл while
https://github.com/phpseclib/phpseclib/blob/2.0.14/phpseclib/Net/SFTP.php#L2011
$size определяется как размер локального файла:
$size
https://github.com/phpseclib/phpseclib/blob/2.0.14/phpseclib/Net/SFTP.php#L1990
$sent начинается с 0 и увеличивается на размер данных, которые передаются во время каждого цикла.
$sent
В конечном итоге объем отправленных данных будет соответствовать (или превышать) размеруфайл и весь цикл будет разорван.